Невозможно включить оба файла (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" `в качестве первого включить.