您的位置:首页 > 其它

windows.h与winsock2.h的包含顺序引起的问题

2014-08-03 13:33 302 查看
使用环境:

Windows、C++

错误描述:

在项目中用到套接字和线程,对应包含头文件 #include <winsock2.h>和#include <windows.h>

但是在编译的时候碰到很多错误,而且几乎都是“ 类型/链接重定义 ”、“ 找不到标识符 ”之类的错误,而且几乎都出现在 winsock2.h和ws2def.h 中;

例如:

error C2011: “sockaddr_in”:“struct”类型重定义 ws2def.h

error C2375: “accept”: 重定义;不同的链接 winsock2.h

error C3861: “socket”: 找不到标识符 server.cpp

错误原因:

做网络开发很多时候都会同时包含头文件

#include <winsock2.h>

#include <windows.h>

如若顺序不当( windows.h 先于 winsock2.h )就会出现很多莫名其妙的错误。

原因在于:windows.h中包含了winsock.h 头文件,而winsock2.h 中的很多内容会与 winsock.h 中的内容相同,从而导致类型的重定义(winsock2.h是winsock.h的后期版本)

解决办法:

看如下内容可知,如果没有定义宏 WIN32_LEAN_AND_MEAN,则会在windows.h中包含winsock.h

因此,解决办法:

在包含<windows.h>之前定义WIN32_LEAN_AND_MEAN宏,如

下所示:

#define WIN32_LEAN_AND_MEAN

#include <windows.h>

补充:

windows.h中有如下内容:

#ifndef WIN32_LEAN_AND_MEAN

#include <cderr.h>

#include <dde.h>

#include <ddeml.h>

#include <dlgs.h>

#ifndef _MAC

#include <lzexpand.h>

#include <mmsystem.h>

#include <nb30.h>

#include <rpc.h>

#endif

#include <shellapi.h>

#ifndef _MAC

#include <winperf.h>

#if(_WIN32_WINNT >= 0x0400)

#include <winsock2.h>

#include <mswsock.h>

#else

#include <winsock.h>

#endif /* _WIN32_WINNT >= 0x0400 */

#endif

#ifndef NOCRYPT

#include <wincrypt.h>

#endif

#ifndef NOGDI

#include <commdlg.h>

#ifndef _MAC

#include <winspool.h>

#ifdef INC_OLE1

#include <ole.h>

#else

#include <ole2.h>

#endif /* !INC_OLE1 */

#endif /* !MAC */

#endif /* !NOGDI */

#endif /* WIN32_LEAN_AND_MEAN */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: