关于WINSOCK.H与winsock2.h中的重定义解决办法分析
来源:互联网 发布:淘宝达人合作 编辑:程序博客网 时间:2024/06/08 06:52
Solution: This problem arises because windows.h (at least, that version of it) includes not winsock2.h butwinsock.h; sadly when Microsoft wrote winsock2.h they chose neither to change windows.h to includewinsock2.h, which replaces winsock.h, nor to include windows.h from winsock2.h and then add the definitions for the new Winsock 2 API methods & structures (this might seem reasonable since Winsock 2 does, strictly speaking, replace Winsock 1, but since the API must be fully backwards-compatible the distinction is somewhat meaningless and there's no real benefit to makingwinsock2.h standalone). The fix is thankfully simple: always "#include <winsock2.h>" before windows.h. However, you must remember that if windows.h has been included by (for example) a higher-level header file that is subsequently including your header file, it's too late - so you must make sure that the higher-level header files respect this convention also. It is however rarely necessary to modify the header files of libraries or other code modules you are using just because you include their header files, and their header files include windows.h - you can just include winsock2.h before you include the library's header files. 在包含jrtplib有时候我也遇到这个问题,解决方法与之相同。一句话,在#include<windows.h>之前 #include <winsock2.h> 问题就可以解决。 问题描述] 原文地址 http://blog.sina.com.cn/s/blog_4906d564010094p8.html
[C++ Error] winsock.h(54): E2344 Earlier declaration of 'fd_set'
[C++ Error] winsock2.h(112): E2146 Need an identifier to declare
[C++ Warning] winsock2.h(144): W8017 Redefinition of 'FD_SET' is not identical
[C++ Error] winsock2.h(153): E2238 Multiple declaration for 'timeval'
[C++ Error] winsock.h(97): E2344 Earlier declaration of 'timeval'
[C++ Error] winsock2.h(209): E2238 Multiple declaration for 'hostent'
[C++ Error] winsock.h(153): E2344 Earlier declaration of 'hostent'
[C++ Error] winsock2.h(222): E2238 Multiple declaration for 'netent'
[C++ Error] winsock.h(166): E2344 Earlier declaration of 'netent'
[C++ Error] winsock2.h(229): E2238 Multiple declaration for 'servent'
[C++ Error] winsock.h(173): E2344 Earlier declaration of 'servent'
[C++ Error] winsock2.h(241): E2238 Multiple declaration for 'protoent'
[C++ Error] winsock.h(185): E2344 Earlier declaration of 'protoent'
[C++ Error] winsock2.h(327): E2238 Multiple declaration for 'in_addr'
[C++ Error] winsock.h(269): E2344 Earlier declaration of 'in_addr'
[C++ Error] winsock2.h(385): E2238 Multiple declaration for 'sockaddr_in'
[C++ Error] winsock.h(319): E2344 Earlier declaration of 'sockaddr_in'
[C++ Error] winsock2.h(395): E2238 Multiple declaration for 'WSAData'
[C++ Error] winsock.h(329): E2344 Earlier declaration of 'WSAData'
[C++ Error] winsock2.h(411): E2146 Need an identifier to declare
[C++ Warning] winsock2.h(455): W8017 Redefinition of 'SO_DONTLINGER' is not identical
[C++ Warning] winsock2.h(512): W8017 Redefinition of 'AF_IPX' is not identical
[C++ Warning] winsock2.h(540): W8017 Redefinition of 'AF_MAX' is not identical
[C++ Error] winsock2.h(546): E2238 Multiple declaration for 'sockaddr'
[C++ Error] winsock.h(492): E2344 Earlier declaration of 'sockaddr'
[C++ Error] winsock2.h(586): E2238 Multiple declaration for 'sockproto'
[C++ Error] winsock.h(501): E2344 Earlier declaration of 'sockproto'
[C++ Error] winsock2.h(625): E2238 Multiple declaration for 'linger'
[C++ Error] winsock2.h(625): E2228 Too many error or warning messages
在包含了<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>
- 关于 winsock.h 与 winsock2.h 中的重定义解决办法
- 关于WINSOCK.H与winsock2.h中的重定义解决办法分析
- 关于WINSOCK.H与winsock2.h中的重定义解决办法分析
- 关于WINSOCK.H与winsock2.h中的重定义解决办法分析
- 关于WINSOCK.H与winsock2.h中的重定义解决办法分析
- 关于WINSOCK.H与winsock2.h中的重定义解决办法分析
- 关于WINSOCK.H与winsock2.h中的重定义解决办法分析
- 转:关于WINSOCK.H与winsock2.h中的重定义解决办法分析
- 关于WINSOCK.H与winsock2.h中的重定义解决办法分析
- 关于WINSOCK.H与winsock2.h中的重定义解决办法分析
- 关于WINSOCK.H与winsock2.h中的重定义解决办法分析
- 关于WINSOCK.H与winsock2.h中的重定义解决办法分析
- 关于WINSOCK.H与winsock2.h中的重定义解决办法分析
- 关于winsock2.h的重定义解决办法
- WINSOCK.H与winsock2.h出现重定义错误的解决方法
- 关于WinSock.h和WinSock2.h的重复定义问题
- winsock.h与winsock2.h冲突解决
- winsock.h与winsock2.h的区别(同时包含windows.h和winsock2.h报错重定义的问题)
- [Compile Error] Classes must not be nested
- DWR与AJAX
- 使用最近未使用页淘汰(NRU)算法模拟实现页淘汰进程
- 动态添加表格一行(javascript)
- php引用机制详解(转帖)
- 关于WINSOCK.H与winsock2.h中的重定义解决办法分析
- 高手必读 网络端口安全防护技巧放送
- Android 模拟器参数
- error PRJ0003 : 生成“cmd.exe”时出错
- javascript 加载
- 功能强大的vc6调试器
- CButton::SetCheck
- 批处理方式设置XP系统的服务程序
- 批处理方式设置XP系统的服务程序