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