不能包含这两个文件(WinSock2,Windows.h)

Ami*_*mit 13 c sockets winapi winsock2

我遇到了包括这两个文件的问题.现在,我知道我需要首先包含Winsock2,然后是windows.h,或者简单地说:

#define WIN32_LEAN_AND_MEAN
Run Code Online (Sandbox Code Playgroud)

但是,我还有问题

我有一个调用的头文件,XS.h看起来像这样

#ifndef XS_H
#define XS_H

#include <winsock2.h>
#include <ws2tcpip.h>
#include <Windows.h>

#endif
Run Code Online (Sandbox Code Playgroud)

XS.h在标题中包括在内Client.h. Client.hinclude看起来像这样:

#ifndef CLIENT_H
#define CLIENT_H

#include "XS.h"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

谢谢!

编辑:我也尝试使用#define _WINSOCKAPI_,虽然它没有解决我的问题...我winsock.h先有,然后windows.h,虽然它仍然为我做错.

Che*_*Alf 18

确保<windows.h>不包含<winsock.h>(提供许多相同的声明<winsock2.h>).在<winsock2.h>我的系统上的文件中有这一行:

#define _WINSOCKAPI_   /* Prevent inclusion of winsock.h in windows.h */
Run Code Online (Sandbox Code Playgroud)

_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优化来保证正确性.

即,最低:

#undef UNICODE
#define UNICODE
#undef _WINSOCKAPI_
#define _WINSOCKAPI_
#include <windows.h>
#include <winsock2.h>

auto main()
    -> int
{}
Run Code Online (Sandbox Code Playgroud)


kir*_*off 5

我确信,一个#include "Winsock2.h"是之前的任何#include "windows.h""#include "Winsock.h"这解决了问题。

耐心一点,一一查看include并建立这个顺序,先 #include "Winsock2.h"然后#include "windows.h"

我检查了递归包含,我发现了头文件,其中包含(递归地)一些 #include "windows.h" 和 "#include "Winsock.h" 并写了一个#include "Winsock2.h"。在这个文件中,我添加了#include "Winsock2.h"` 作为第一个包含。