VS winsock.h和ws2def.h大量重定义报错的问题
报错原因:
我们知道,Windows网络编程至少需要两个头文件:winsock2.h和windows.h,而在WinSock2.0之前还存在一个老版本的winsock.h。正是这三个头文件的包含顺序,导致了上述问题的出现。
winsock2.h的内容,在文件开头有如下宏定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #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自带的文件存在差异)
1 2 3 4 | #ifndef _MAC #include <winperf.h> #include <winsock.h> #endif |
其实很容易理解,文件间相互包含,而的定义顺序导致了winsock在winsock2之前被包含,就会导致大量重复定义的错误。
解决:
找到代码中包含windows.h和winsock2.h的地方,让winsock2在windows之前被包含就行了
(或者专门写个头文件,用于解决这个问题)
在stdafx.h中加入:
1 2 | #include <WinSock2.h> #include <windows.h> |
就可以解决了。
如果发现解决方案里并未发现包含这两个文件,可以那么很有可能是使用的开发包或者其他文件中使用了内容。
(参考博客:https://blog.csdn.net/weixin_43956221/article/details/117217614)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗