最近做IPV6兼容升级,发现包含了winsock2.h后,会出现编译报错。部分报错信息如下:
winsock2.h(109) : error C2011: 'fd_set' : 'struct' type redefinition
winsock2.h(144) : warning C4005: 'FD_SET' : macro redefinition
winsock.h(88) : see previous definition of 'FD_SET'
winsock2.h(153) : error C2011: 'timeval' : 'struct' type redefinition
winsock2.h(209) : error C2011: 'hostent' : 'struct' type redefinition
winsock2.h(222) : error C2011: 'netent' : 'struct' type redefinition
winsock2.h(229) : error C2011: 'servent' : 'struct' type redefinition
winsock2.h(241) : error C2011: 'protoent' : 'struct' type redefinition
winsock2.h(397) : error C2011: 'sockaddr_in' : 'struct' type redefinition
winsock2.h(407) : error C2011: 'WSAData' : 'struct' type redefinition
经过调查,发现是由于我原来工程引入的windows.h和winsock2.h冲突,引发了重定义错误。
附上解决方案:
一、官方备注解决方案:
使用宏 #define WIN32_LEAN_AND_MEAN
参考文档:WIN32_LEAN_AND_MEAN宏的官网示例

二、头文件先后顺序调整
在包含windows.h前,先包含winsock2.h
示例如下:
#include "winsock2.h"
#include <windows.h>
三、另外一种错误解决方案
如果包含winsock2.h以后出现下面的错误:
fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>
这个时候,需要检查一下工程中是否包含了<afxwin.h>,如果包含了这个头文件,看一下winsock2.h是否在此头文件引入之前包含了。如果是这样的话,将winsock2.h可以写到<afxwin.h>后一行进行包含

在进行IPV6兼容升级时,遇到包含winsock2.h后编译报错,如'struct'类型重定义等问题。错误源于winsock2.h与windows.h的冲突。解决方法包括:1) 使用宏`#define WIN32_LEAN_AND_MEAN`;2) 调整头文件包含顺序,先包含winsock2.h再包含windows.h;3) 如果出现特定错误,检查工程是否误包含<afxwin.h>,确保winsock2.h在其后引入。

1300

被折叠的 条评论
为什么被折叠?



