November 23, 2007
[VC++] winsock2.h 与 windows.h 冲突的解决
今天又遇到了怪事。只要一包含 atlhttp.h 头文件,原本好好的工程一编译立马就出 100 多个 error,仔细查看输出发现前面一大半几乎都是下面这个样子:
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock2.h(112) : error C2011: ‘fd_set’ : ’struct’ type redefinition
c:\program files\microsoft visual studio 8\vc\platformsdk\include\winsock.h(54) : see declaration of ‘fd_set’
后面的另一半 error 也都跟 winsock.h 这个头文件有关。但是我在整个工程中并没有 #include <winsock.h> 或 #include <winsock2.h>,基本上可以推断出它们是被工程已包含的某个头文件包含进来的。经过查看,atlhttp.h 中包含了 winsock2.h,雌雄双煞已经现身了一个,另一个呢?
Google 了一下发现了这篇文章 The winsock2.h header file must be included before windows.h,文章说得很清楚,由于 windows.h 包含的是 winsock.h 而不是 winsock2.h,因而工程中同时包含有 windows.h 和 winsock2.h 相当于同时包含了 winsock.h 和 winsock2.h,引起重复定义也就不奇怪了。文章同时也给出了解决方法:永远在 windows.h 之前包含 winsock2.h,并调整 IDE 的包含目录优先级(在 VC++ 2005 中,atlhttp.h 在 atlmfc 目录,windows.h 在 PlatformSDK 目录)。我的问题解决了吗?No……
我的代码根本不吃这一套,问题依旧。那我也只好来硬的了,把 windows.h 的 193 行从 #include <winsock.h> 修改为 #include <winsock2.h>,再次编译,通过。
声明:至于有没有引发其它内伤,本人不清楚。任何对此帖中描述的修改行为进行模仿而导致的任何恶性后果,一律与本人无关。 ^_^

漫步 at 23:50 Nov 23, 2007 ₪
我来抢沙发了
如果方便的话,请你参与我组织的博客串联活动怎么样,谢谢。详情见
http://roamlog.cn/archives/5-questions-about-you.html
如果你不喜欢,可以直接无视的,嘿嘿。
Gomain at 10:51 Nov 24, 2007 ₪
[VC++]已经很少用了,主要也就是文件头差错比较累赘。
北极冰仔 at 14:27 Nov 24, 2007 ₪
Gomain » VC++ 的地位是其它语言无法撼动的。
fatbone at 14:09 Dec 25, 2007 ₪
这个问题其实已经是很著名的了,好几年前也是被卡过。你定义一个宏好像也是可以bypass winsock.h
北极冰仔 at 16:49 Dec 25, 2007 ₪
fatbone » 谢谢大侠,这个宏应该如何写呢?(:
Agent Mal at 22:33 Aug 05, 2008 ₪
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include
就可以了,你观察windows.h里#include 前面一点的地方就有这个宏了…
北极冰仔 at 08:01 Aug 06, 2008 ₪
@Agent Mal 谢谢!我在发这个帖之后也了解到可以使用这个宏了 ^_^