问题描述:在 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/