Visual Studio报错——WinSock2.h以及ws2def.h大量重复定义报错

under 疑难杂症  C++  tag     Published on June 23rd , 2020 at 11:07 am

一、问题描述

不小心某个文件包含了windows.h头文件,而windows.h文件里面包含着winsock.h文件,

如果你下次使用winsock2.h文件时,位置不对,然后编译器会给你一大堆重定义错误问题。

二、解决方法

1. 初级解决办法:

winsock2.h文件放在任何可能包含winsock.h文件(尤其是windows.h文件,它就包含了winsock.h文件)的前面,因为winsock2.h头文件有这样的宏定义:

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

如果在winsock2.h之后再引用winsock.h头文件,那么winsock.h文件并没有什么卵用。

在生成应用程序时,即使不是MFC应用程序,也有有这个东西:

而网上对stdafx.h文件的解释是:

把一个工程(Project)中使用的一些MFC标准头文件(如Windows.HAfxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。

可怕的是它包含了windows.h文件,然而并不可怕的是:当我们使用AppWizard来自动生成某些项目的时候,系统会自动把所需要include的头文件在stdafx.h中先include一下,这样,我们只需要直接include这个stdafx.h文件即可。只在使用AppWizard来自动生成项目的时候,才出现.否则,就没有必要include此头文件stdafx.h了。

参考:stdafx.h作用

所以如果是MFC等windows窗口项目,需要把stdafx.h预编译头删掉,否则其它应用删不删都无所谓了。

但是……即使采取了以上办法,满足winsock2.h在前的关系了,但是仍然有重定义.这时候就需要用终极解决办法

2.终极办法

终极办法是:添加`WIN32_LEAN_AND_MEAN·宏定义,直接在vs的设置里预先添加这个宏定义就ok啦:

该宏定义的作用:

不加载MFC所需的模块。在编译链接时,以及在最后生成的一些供调试用的模块时,速度更快,容量更小。

然而,我仍然疑惑的是,我在哪里加载MFC所需的模块了,其实我挺好奇上面那个图中_WINDOWS这个宏是干嘛,但是暂时没有搜到相关资料。


本文由simyng创作, 采用知识共享署名4.0 国际许可协议进行许可,转载前请务必署名
  文章最后更新时间为:June 23rd , 2020 at 03:07 am