Невозможно включить оба файла (WinSock2, Windows.h)

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

#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 include выглядит следующим образом:

#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\8.0\include\um\ws2tcpip.h   703
Error   61  error C2375: 'WSAStartup' : redefinition; different linkage c:\program files (x86)\windows kits\8.0\include\um\winsock2.h   2296
Error   49  error C2375: 'send' : redefinition; different linkage   c:\program files (x86)\windows kits\8.0\include\um\winsock2.h   2026

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

Спасибо!

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

Ответ 1

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

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

_WINSOCKAPI_ включить охрану может быть внутренней деталью реализации, но в качестве практического решения я бы опирался на нее, просто определяя этот символ, прежде чем включать <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 для правильности.

I.e., минимум:

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

auto main()
    -> int
{}

Ответ 2

Я убедился, что #include "Winsock2.h" находится перед любыми #include "windows.h" и "#include "Winsock.h", и это разрешило случай.

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

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