winsock2.h与ws2def.h等文件大量报错相关问题解决方法

问题:

最近在写网络编程相关内容,本来好好的代码写着写着就出现了大量错误
在这里插入图片描述
看了下文件,全都是winsock2、ws2def 、ws2ipdef、ws2tcpip内的报错

缘由:

我们知道,Windows网络编程至少需要两个头文件:winsock2.h和windows.h,而在WinSock2.0之前还存在一个老版本的winsock.h。正是这三个头文件的包含顺序,导致了上述问题的出现。
winsock2.h的内容,在文件开头有如下宏定义:

#ifndef _WINSOCK2API_
#define _WINSOCK2API_
#define _WINSOCKAPI_   /* Prevent inclusion of winsock.h in windows.h */

......
中间已省略
......

/*
 * Pull in WINDOWS.H if necessary
 */
#ifndef _INC_WINDOWS
#include <windows.h>
#endif /* _INC_WINDOWS */

这是最常见的防止头文件重复包含的保护措施。
_WINSOCKAPI_的定义阻止了对老文件winsock.h的包含
即是说,如果用户先包含了winsock2.h就不允许再包含winsock.h了,
后半段作用是:如果用户没有包含windows.h(_INC_WINDOWS在windows.h中定义)就自动包含它,以定义WinSock2.0所需的类型和常量等。

现在切换到windows.h,我们会的发现以下内容:(注:这里是MS的Platform SDK中的windows.h与VC自带的文件存在差异)

#ifndef _MAC
#include <winperf.h>
#include <winsock.h>
#endif

其实很容易理解,文件间相互包含,而的定义顺序导致了winsock在winsock2之前被包含,就会导致大量重复定义的错误。

解决:

找到代码中包含windows.h和winsock2.h的地方,让winsock2在windows之前被包含就行了
(或者专门写个头文件,用于解决这个问题)

#include <WinSock2.h>
#include <windows.h>

如果发现解决方案里并未发现包含这两个文件,
那么很有可能是使用的开发包或者其他文件中使用了内容

我就是类似问题,开发中使用了winpcap,winpcap开发包中会包含winsock2,所以在windows.h之前包含pacp.h
在这里插入图片描述
在改变顺序之后
在这里插入图片描述
报错就全部解决了,剩下的都是我的自有bug(妈耶,写错这么多的嘛)

  • 19
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值