不能同时包含这两个文件(WinSock2,Windows.h)
我遇到了包括这两个文件的问题。 现在,我知道我需要首先包含Winsock2,然后是windows.h,或者简单地说:
#define WIN32_LEAN_AND_MEAN
但是,我还有问题
我有一个名为XS.h
的头文件,看起来像这样
#ifndef XS_H #define XS_H #include #include #include #endif
我在头文件Client.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
,虽然它仍然为我winsock.h
。
确保
不包含
(它提供了许多与
相同的声明)。 在我的系统上的
文件中有这一行:
#define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */
_WINSOCKAPI_
包含guard可能是一个内部实现细节,但作为一个实际的解决方案,我会依赖它,只需在包含
之前定义此符号,例如在编译器调用中(对于IDE意味着在IDE项目设置中) )。
或者,您可以尝试在
之前始终包含
,以便建立相关的包含警卫(不管它是什么)(但我认为这比仅仅假设上面的警卫实际上更好 – 更加脆弱 -所定义);
或者您可以定义WIN32_LEAN_AND_MEAN
,这可以防止
包含
但也可以阻止其他一些标题(从我的系统源代码中列出
,
,
,
,
,
,
,
,
,
,
,
,
,
,
和
)。 我不建议依赖WIN32_LEAN_AND_MEAN
优化来确保正确性 。
即,最低:
#undef UNICODE #define UNICODE #undef _WINSOCKAPI_ #define _WINSOCKAPI_ #include #include auto main() -> int {}
我确保#include "Winsock2.h"
在任何#include "windows.h"
和"#include "Winsock.h"
,这就解决了这个问题。
只是耐心一点,看看包含一个一个并建立这个顺序,首先#include "Winsock2.h"
然后#include "windows.h"
我检查了递归包含,我发现了包含(递归)一些#include“windows.h”和“#include”Winsock.h“的头文件,并写了一个#include”Winsock2.h“。在这个文件中,我添加了#include“Winsock2.h”`作为第一个包括。