不能同时包含两个文件(WinSock2、Windows.h)

不能同时包含两个文件(WinSock2、Windows.h),c,sockets,winapi,winsock2,C,Sockets,Winapi,Winsock2,我在包含这两个文件时遇到问题。 现在,我知道我需要首先包括Winsock2,然后是windows.h,或者简单地说: #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

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

#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
中唯一包含的,但我仍然会出错(正如您所看到的,
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
,尽管它仍然会为我造成错误。

请确保
不包括
(它提供了许多与
相同的声明)。在我的系统上的
文件中有以下行:

#define _WINSOCKAPI_   /* Prevent inclusion of winsock.h in windows.h */
\u WINSOCKAPI
包含保护可能是一个内部实现细节,但作为一个实际解决方案,我将依赖它,只需在包含
之前定义此符号,例如在编译器调用中(对于IDE而言,这意味着在IDE项目设置中)

或者你可以尝试,为了建立相关的include-guard,不管它是什么(但我认为这比仅仅假设上面的guard实际上是定义良好的要脆弱得多)

或者您可以定义
WIN32\u LEAN\u和\u MEAN
,这将阻止
包括
,但也包括一些其他标题(在我的系统上从源代码中列出的是
,和
).我不建议依靠
WIN32\u LEAN\u和\u MEAN
优化来确保正确性

即,最低限度:

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

auto main()
    -> int
{}
#未定义UNICODE
#定义UNICODE
#未定义的WINSOCKAPI_
#定义WINSOCKAPI_
#包括
#包括
自动主机()
->int
{}
我确保在任何
\include“windows.h”和
“include”Winsock.h
之前有一个
\include“Winsock2.h”
,这就解决了这个问题

耐心一点,逐个查看包含并建立此顺序,首先
#包含“Winsock2.h”
然后
#包含“windows.h”


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

将包含添加到pch.h:

// TODO: add headers that you want to pre-compile here
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>

// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")
//TODO:在此处添加要预编译的头文件
#如果NDEF WIN32_LEAN_和_MEAN
#定义WIN32_精益_和_平均值
#恩迪夫
#包括
#包括
#包括
#包括
#包括
//需要链接到Ws2_32.lib、Mswsock.lib和Advapi32.lib
#pragma注释(lib,“Ws2_32.lib”)
#pragma注释(lib,“Mswsock.lib”)
#pragma注释(lib,“AdvApi32.lib”)

在头文件中使用
#pragma一次
我建议在每个源文件中首先包括windows.h和windowsx.h(最好使用stdafx.h文件)我不确定它是否解决了这个特殊的问题,但它大大减少了混乱。我将
客户端.h
includes改为:
#pragma once#include#include#include“Chat.h”
虽然仍然不起作用,但同样的错误……这可能与微软的“智能感知”有关不使用与编译器本身相同的分析引擎,因此它可以并且确实会发出“错误消息”对于完全有效的代码。也就是说,这听起来是一个真正的问题,而不仅仅是一个Intellisense明显的问题。在包含任何其他windows API头之前,您应该始终包含
windows.h
。这是因为Microsoft头通常不包含所需的所有内容,即不遵循良好的编程实践。可以只需将
设置为强制包含,但这重复了导致问题的弊端:更好地修复源代码。事实证明,我在我的主源文件中包含了windows.h,这导致了问题,然后
WINSOCKAPI
修复了其他错误…谢谢!WIN32\u LEAN\u和\u MEAN
不是最佳选择吗?为什么不是使用它时包含的顺序是什么?显然没有明确的“最佳”选择。例如,考虑第三个依赖于<代码> <代码>的标题,在一个或多个标题中拖拽,这些标题被<代码> > Wi32“请参阅Windows.H以确定将被排除的文件"。因此,这两种方法都是基于查找MS标头代码,该代码可能会更改。如果排除列出的标头没有问题,可以同时使用这两种方法。我意识到这是一篇旧文章,但上述解决方案并不总是有效。有第三方库可以并且将包括windows.h,您不知道。这是一个很好的示例我的首选是为任何不需要winsock的(CMake)模块定义WIN32_LEAN_和_MEAN。
// TODO: add headers that you want to pre-compile here
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>

// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")