Windows.h 与 Winsock.h 的冲突问题
大凡在Windows平台下用C++做网络开发很多时候都会同时包含这两个头文件,如若顺序不当(windows.h先于winsock2.h)就会出现很多莫名其妙的错误。诸如:
警告 4 warning C4005: “AF_IPX”: 宏重定义 c:/program files/microsoft sdks/windows/v6.0a/include/ws2def.h 91
警告 5 warning C4005: “AF_MAX”: 宏重定义 c:/program files/microsoft sdks/windows/v6.0a/include/ws2def.h 127
警告 6 warning C4005: “SO_DONTLINGER”: 宏重定义 c:/program files/microsoft sdks/windows/v6.0a/include/ws2def.h 163
错误 7 error C2011: “sockaddr”: “struct”类型重定义 c:/program files/microsoft sdks/windows/v6.0a/include/ws2def.h 206
问题描述]
在包含了<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.csdn.net/derryzhang/article/details/6605064点击查看详情

浙公网安备 33010602011771号