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

来源:互联网 发布:淘宝代销怎么上架宝贝 编辑:程序博客网 时间:2024/04/30 08:21

使用环境:

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 */

原创粉丝点击