不能同时包含这两个文件(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”`作为第一个包括。