Loading...

[VC++] winsock2.h 与 windows.h 冲突的解决

Visual Studio 2005 Logo今天又遇到了怪事。只要一包含 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.hwinsock2.h 相当于同时包含了 winsock.hwinsock2.h,引起重复定义也就不奇怪了。文章同时也给出了解决方法:永远在 windows.h包含 winsock2.h,并调整 IDE 的包含目录优先级(在 VC++ 2005 中,atlhttp.hatlmfc 目录,windows.hPlatformSDK 目录)。我的问题解决了吗?No……

我的代码根本不吃这一套,问题依旧。那我也只好来硬的了,把 windows.h 的 193 行从 #include <winsock.h> 修改为 #include <winsock2.h>,再次编译,通过。 :lol:

声明:至于有没有引发其它内伤,本人不清楚。任何对此帖中描述的修改行为进行模仿而导致的任何恶性后果,一律与本人无关。 ^_^

7Comment(s). Blabla or Trackback

  • 漫步 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 谢谢!我在发这个帖之后也了解到可以使用这个宏了 ^_^

Blabla ↓

Connecting to server...