Не удается включить оба файла (WinSock2, Windows.ч)

у меня проблема, включая файлы. Теперь я знаю, что мне нужно сначала включить Winsock2, а затем windows.ч, или проще говоря:

#define WIN32_LEAN_AND_MEAN

но, у меня все еще есть проблемы

у меня есть файл заголовка, который называется XS.h выглядит так:

#ifndef XS_H
#define XS_H

#include <winsock2.h>
#include <ws2tcpip.h>
#include <Windows.h>

#endif

и я в том числе XS.h в заголовке Client.h. Client.h включить выглядит так:

#ifndef CLIENT_H
#define CLIENT_H

#include "XS.h"

XS.h Это мой единственный включить в Client.h, но я все еще получаю ошибки (и, как видите,Winsockвключен перед windows.h

я получаю около 78 ошибок, вот некоторые из них:

Error   90  error C3861: 'WSASetLastError': identifier not found    c:program files (x86)windows kits.0includeumws2tcpip.h   703
Error   61  error C2375: 'WSAStartup' : redefinition; different linkage c:program files (x86)windows kits.0includeumwinsock2.h   2296
Error   49  error C2375: 'send' : redefinition; different linkage   c:program files (x86)windows kits.0includeumwinsock2.h   2026

как я могу решить эту проблему?

спасибо!

Edit: я пытался использовать #define _WINSOCKAPI_ также, хотя это не решило моих проблем... У меня winsock.h во-первых, тогда windows.h, хотя он все еще делает ошибку для меня.

2 ответов


убедитесь в том, что <windows.h> не входит <winsock.h> (который предоставляет многие из тех же объявлений, что и <winsock2.h>). В <winsock2.h> файл в моей системе есть такая строка:

#define _WINSOCKAPI_   /* Prevent inclusion of winsock.h in windows.h */

на _WINSOCKAPI_ include guard может быть внутренней деталью реализации, но в качестве практического решения я бы полагался на нее, просто определяя этот символ перед включением <windows.h>, например, в вызове компилятора (что для IDE означает в проекте IDE настроить.)

в качестве альтернативы вы можете попробовать всегда включать <winsock2.h> до <windows.h>, чтобы установить соответствующий включить охрану, что бы это ни было (но это я думаю, гораздо более хрупким, чем просто предполагая, что вышеупомянутый охранник практически четко определен);

или вы можете определить WIN32_LEAN_AND_MEAN, который предотвращает <windows.h> С <winsock.h> но и некоторые другие заголовки (список из источника в моей системе это <cderr.h>, <dde.h>, <ddeml.h>, <dlgs.h>, <lzexpand.h>, <mmsystem.h>, <nb30.h>, <rpc.h>, <shellapi.h>, <winperf.h>, <wincrypt.h>, <winefs.h>, <winscard.h>, <winspool.h>, <ole2.h> и <commdlg.h>). Я не рекомендую полагаться на WIN32_LEAN_AND_MEAN оптимизация достоверность.

И. Е., минимальные:

#undef UNICODE
#define UNICODE
#undef _WINSOCKAPI_
#define _WINSOCKAPI_
#include <windows.h>
#include <winsock2.h>

auto main()
    -> int
{}

я убедился, что #include "Winsock2.h" - перед #include "windows.h" и "#include "Winsock.h" и это решило дело.

просто вопрос терпения, посмотрите на включает в себя один за другим и установить этот порядок, во-первых #include "Winsock2.h" затем #include "windows.h"

Я проверил рекурсивные includes, я заметил заголовочные файлы, которые включают (рекурсивно) некоторые #include "windows.h " и "#include " Winsock.h "и напишите#include" Winsock2.ч." в этих файлах я добавил#include " Winsock2.h` ' как первый включают.