关于WINSOCK.H与winsock2.h中的重定义解决办法分析

问题描述:在 VC 6.0中使用socket相关的函数时没有什么问题,可是到了.net下就有以下类似的错误,

 

 

c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(112) : error C2011: “fd_set”:“struct”类型重定义
       c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock.h(54) : 参见“fd_set”的声明
c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(147) : warning C4005: “FD_SET”:宏重定义
       c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock.h(88) : 参见“FD_SET”的前一个定义
c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(156) : error C2011: “tim”:“struct”类型重定义
       c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock.h(97) : 参见“tim”的声明
c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(212) : error C2011: “hostent”:“struct”类型重定义
       c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock.h(153) : 参见“hostent”的声明
c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(225) : error C2011: “netent”:“struct”类型重定义
       c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock.h(166) : 参见“netent”的声明
c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(232) : error C2011: “servent”:“struct”类型重定义
       c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock.h(173) : 参见“servent”的声明
c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(244) : error C2011: “protoent”:“struct”类型重定义
       c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock.h(185) : 参见“protoent”的声明
c:\program files\microsoft visual studio8\vc\platformsdk\include\winsock2.h(400) : error C2011:“sockaddr_in”: “struct”类型重定义

 

 

解决方法:

根据网上搜索得到的资料, 以及检查 WinSock2.h , WinSock.h , windows.h 三个文件,
可以得知 这个错误是你的文件中即包含了 WinSock.h 又包含了WinSock2.h 文件。
如果你在文件中 写
-------------
#include <WinSock.h>
#include <WinSock2.h>
---------------------------
这样就会出错,但
-------------
#include <WinSock2.h>
#include <WinSock.h>
---------------------------
这样写就不会出错,因为WinSock2.h 中已经通过定义#define _WINSOCKAPI_ 来避免在包含WinSock.h了。

但这个错误跟多的出现实因为 windows.h 和WinSock2.h同时使用的情况,因为 windows.h 默认会包含WinSock.h ,所以如果你在文件中写
-------------
#include <Windows.h>
#include <WinSock2.h>
---------------------------
就会出现这个错误。
但写成
-----------------------------
#define WIN32_LEAN_AND_MEAN   // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
#include <WinSock2.h>
--------------------------------
就也不会出错,因为WIN32_LEAN_AND_MEAN 宏没有定义的情况下windows.h才会包含 WinSock.h 头文件的。具体可以看windows.h文件。stdafx.h头文件就是先定义了一个WIN32_LEAN_AND_MEAN的。


但我的错误却都是这样写,而是因为写成
-----------------------
#include <objbase.h>
#include <xxxxxx.h>
---------------------
原因是objbase.h 又先去包含了windows.h 头文件,而xxxxxx.h 文件中包含了 WinSock2.h 文件。


出现这类问题只能自己去检查头文件的引用和顺序等关系了。当文件引用关系比较复杂的情况下,找起来还是很麻烦的。

 

 

第二种[解决方案]

问题描述]
   在包含了<windows.h>以及<winsock2.h>的工程中,编译有时会出现如
下错误:

     error C2011: 'fd_set' : 'struct' type redefinition
     error C2011: 'timeval' : 'struct' type redefinition
                     ....
     error C2375: 'accept' : redefinition; different linkage
[原因分析]
   主要原因是因为<windows.h>中包含了<winsock.h>头文件,由于其版
本的不同,导致出
现上述的错误。<windows.h>中相关代码如下:
               #ifndef WIN32_LEAN_AND_MEAN
               #include <cderr.h>
               #include <dde.h>
               #include <ddeml.h>
               ........
                #ifndef _MAC
               #include <winperf.h>
               #include <winsock.h>
               #endif
                .......

               #include <commdlg.h>
               #endif
               #endif

[解决方案]

由以上代码可以看出如果在没有定义WIN32_LEAN_AND_MEAN宏 的大前
提下windows.h有可能包含winsock.h 头文件,因此我们得出一个很简单
的解决方
法就是在包含<windows.h>之前定义WIN32_LEAN_AND_MEAN宏,如
下所示:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>

 

 

转载:

http://blog.chinaunix.net/space.php?uid=20680966&do=blog&cuid=689402

http://xia-siyu.blog.163.com/blog/static/2748304120106984151155/

你可能感兴趣的:(SOC)