给qt工程添加一个日志模块,该模块只有一个头文件,顺手就把这个头文件放在cpp的顶部include了,结果一编译出来一堆错误,仔细一看,都是些winsock2相关的错误。
当时就有点纳闷了,这个新增的头文件并没有使用winsock2啊,为啥会出这种问题,把错误信息百度一下,看来有很多人也遇到了。
原来是头文件的包含顺序问题,日志的头文件包含了windows.h,而日志后的QT的网络相关的头文件包含了winsock2.h,从而导致出了问题,只需要winsock2.h的顺序在windows.h之前就行了,解决方案很简单,后续统一都先包含qt的头文件,然后再是自己的头文件。
追究起来,这就是头文件的反复包含问题,windows.h包含了winsock.h,而winsock和winsock2只能2选1,都定义了同样的宏WINSOCKAPI,如果windows.h先于winsock2.h,那么导致使用了winsock.h,定义了WINSOCKAPI,从而后续winsock2.h的内容都不会被添加进来,进而导致编译错误。
当然,解决的方式不单单只有调整这个包含顺序,也可以通过定义WIN32_LEAN_AND_MEAN让windows.h不包含winsock.h而解决(VC工程默认生成的stdafx.h有这个宏定义,QT则没有,所以用QT的时候反而会遇到这些问题)。
【坑】winsock2.h和windows.h的include顺序
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
- Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...