QT里的windows.h和winsock2.h重定义错误

本文深入探讨了在使用QT-Creator与MSVC编译工具时,winsock2.h与windows.h文件包含顺序不当导致的编译错误。详细分析了错误根源,并提供了调整包含顺序、使用预处理器宏及在project.pro文件中定义宏等多种解决方案。

windows.h和 winsock2.h的相爱相杀的故事,在网络上广为流传,引发无数血案。各种作案场景,前置环境复杂纷繁,其中root原因和发生规律,以及解决方法,大致几种。今天就写上网上没有出现过的解决方法。

现场

前2天,一同事QT-Creator(msvc编译工具)开发一个远程socket通讯软件,包含 winsock2.h后,编译失败,各种重复winsock2.h里的结构体变量的重复包含。出错信息里,直接说明已经包含了winsock.h文件了,winsock.h里定义了很多和winsock2.h里重复的变量定义。

Root原因

在工程里其他地方包含或者间接包含了windows.h文件。而在windows.h文件里,默认会间接包含winsock.h文件。如果2个头文件包含的顺序如下,是可以幸免遇难的(侥幸逃过)。

#include<winsock2.h>
#include<windows.h>

因为winsock2.h里一个宏定义,可以防止包含winsock.h文件。

#define WINSOCKAPI /* Prevent inclusion of winsock.h in windows.h /

但如果是以下定义顺序,就必然重复包含winsock.h文件,而导致编译失败。

#include<windows.h>
#include<winsock2.h>

解决方法

1.  调整头文件的包含顺序,让winsock2.h文件首先被包含;
2.  使用以下宏定义来避免window.h间接加载winsock.h;

#define WIN32_LEAN_AND_MEAN
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值