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 */
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 */
相关文章推荐
- Windows.h与Winsock2.h包含顺序问题
- windows.h和winsock2.h包含顺序问题(转)
- winsock.h与winsock2.h的区别(同时包含windows.h和winsock2.h报错重定义的问题)
- windows.h与winsock2.h的包含顺序
- windows.h与winsock2.h的包含顺序
- windows.h与winsock2.h的包含顺序
- 有关同时包含<winsock2.h>与<windows.h>头文件的问题
- @@RowCount和“SET NOCOUNT ON”在触发器中使用的先后顺序引起的问题
- VS2010包含windows.h时winsock2.h出现"fd_set":struct类型重定义
- 一个操作符优先级顺序引起的问题
- C#关于Windows窗体最大化所引起的闪烁问题的处理经验
- meta和title的顺序问题引起IE显示空白页
- meta和title的顺序问题引起IE显示空白页
- 头文件包含顺序问题
- winsock2.h和windows.h冲突问题的解决方案
- C++头文件包含顺序问题
- 动态链接库中分配内存引起的问题-- windows已在XX.exe中触发一个断点
- UserControl 中包含封装了集合对象的属性被设计器自动初始化所引起的错误!也有关于List的问题
- 一个因为顺序问题引起的错误!
- Oracle 8.1.6,Windows 2000 Server上安装基于Pro*C 的应用软件:change_on_install口令引起的问题