牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

关于 WinSock2.h 与 WinSock.h 文件重定义冲突的 解决办法

事实上一直都用的是Winsock1的,还从来没有用过Winsock2,今天开始使用它,但是出现了一大堆的错误,都是那个C2011和C2375之类的错误。当时就想,是不是2和1发生了冲突了?但是我没有包含过1的头文件啊?!
后来一查,在Windows.h里面发现了这么一段代码:

#ifndef _MAC
#include 
<winperf.h>
#include 
<winsock.h>
#endif

我就一个倒。。。。
原来是这里包含了。。。。
对付这个的终极解决办法是:

#define WIN32_LEAN_AND_MEAN 
#include 
<Windows.h>

即是在包含Windows.h前加入#define WIN32_LEAN_AND_MEAN这条语句,它能够将上面的语句包含winsock.h的语句消减掉。

后面在网上看到另外一种解决方案,其代码如下:

#ifndef _WINSOCKAPI_           // 没有包含winsock.h
#define _WINSOCKAPI_           // 避免再包含winsock.h
    #ifndef _WINSOCK2API_      
// 没有包含winsock2.h
    #define _WINSOCK2API_      // 避免再包含winsock2.h
        #include 
<winsock2.h>
        #pragma comment(lib, 
"ws32_2.lib")
    
#endif
#endif

其实这个代码是有缺陷的,如果是先包含的windows.h,然后再包含这段语句的,事实上,这个语句什么事情都没有做,是一条废语句,要想它有用,就必须在包含windows.h之前包含这段语句所在的头文件。事实上,这个解决方案不是很好的。
使用这个方法,必须要注意的是:必须在包含Windows.h头文件之前使用它,否则很有可能是无效的,当然如果您在包含Windows.h之前使用了#define WIN32_LEAN_AND_MEAN,那么,自然它还是有效的了。这是治标不治本的一个办法。

posted on 2008-04-20 12:53 杨粼波 阅读(4331) 评论(4)  编辑 收藏 引用

评论

# re: 关于 WinSock2.h 与 WinSock.h 文件重定义冲突的 解决办法 2008-04-20 13:28 杨粼波

对WIN32_LEAN_AND_MEAN有了一个深刻印象了。  回复  更多评论   

# re: 关于 WinSock2.h 与 WinSock.h 文件重定义冲突的 解决办法 2008-04-21 11:58 陈振辉

这样办嘛!
#if !defined(_WINDOWS_)
#include "winsock2.h"
#endif

_WINDOWS_ 在windows.h文件的开头定义  回复  更多评论   

# re: 关于 WinSock2.h 与 WinSock.h 文件重定义冲突的 解决办法 2008-04-21 15:00 杨粼波

必须在包含windows.h之前用#define WIN32_LEAN_AND_MEAN才好。。。。
不用的话,包含了windows.h就会包含winsock.h。  回复  更多评论   

# re: 关于 WinSock2.h 与 WinSock.h 文件重定义冲突的 解决办法 2009-02-09 09:52 steveyzhang

winsock.h 是window32 上使用的; 在window mobile 上, 应该使用的是winsock2.h;  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理