包括 <winsock2.h> 和 <windows.h> - Winsock.h 与 Winsock2.h 警告的可能解决方案?

问题描述 投票:0回答:1

在包含

<windows.h>
<winsock2.h>
时,我遇到一个相对常见的问题(Windows 10、Eclipse、MinGW,使用
-lws2_32
链接到 WinSock)

#warning 请在 windows.h 之前包含 Winsock2.h

我有一个翻译单元,其中包括

winsock2.h
windows.h
- 一个非 Boost ASIO TCP 客户端。在添加
#define WIN32_LEAN_AND_MEAN
#define _WINSOCKAPI_
之前,我尝试了各种
windows.h
winsock2.h
,但没有任何帮助。
#include
的顺序也完全无关紧要,总是弹出相同的错误,并且警告总是在这个TCP客户端的相同位置触发。

c++ winapi mingw winsock winsock2
1个回答
1
投票

TLDR:项目中的另一个

.cpp
文件包含
<windows.h>
,并且默认情况下
windows.h
包含
winsock.h
,除非明确告知不要这样做。

问题的原因原来是另一个翻译单元,在逻辑上与触发警告消息的位置完全无关,也出于自己的目的而包含

<windows.h>
(在我的例子中是串行端口库)。

该库从未发出任何警告,没有迹象表明这是问题的根源。在一个最小的示例项目中没有 WinSock 版本冲突警告,但在我的主要大型项目中仍然有警告之后,我有点半随机地偶然发现了它。这让我觉得

windows.h
可能包含在其他地方,并且
windows.h
会自动拉动
winsock.h
,除非明确告知不要这样做。

第一个选择是跨平台串行库,因为使用此类库是有意义的

<windows.h>

一旦我确定串行库中的

<windows.h>
不会自动包含
<winsock.h>
,ASIO TCP 客户端翻译单元中的警告就消失了。就我而言,我只是将
-DWIN32_LEAN_AND_MEAN
添加到预处理器定义的符号 (
-D
)。此外,在包含
WIN32_LEAN_AND_MEAN
之前在串行库标头中定义
windows.h
也有效。这意味着,在项目中的任何位置包含
<windows.h>
时需要格外小心。

最终,我选择了这个:

g++ -std=c++2a -DWIN32_LEAN_AND_MEAN...

© www.soinside.com 2019 - 2024. All rights reserved.