Не удается включить оба файла (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` ' как первый включают.