﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Where there is a dream ,there is hope-随笔分类-TCP/IP</title><link>http://www.cppblog.com/Husiwa/category/15277.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 08 Dec 2010 09:20:44 GMT</lastBuildDate><pubDate>Wed, 08 Dec 2010 09:20:44 GMT</pubDate><ttl>60</ttl><item><title>windows.h与winsock2.h的包含顺序</title><link>http://www.cppblog.com/Husiwa/archive/2010/12/07/135700.html</link><dc:creator>Husiwa</dc:creator><author>Husiwa</author><pubDate>Tue, 07 Dec 2010 07:30:00 GMT</pubDate><guid>http://www.cppblog.com/Husiwa/archive/2010/12/07/135700.html</guid><wfw:comment>http://www.cppblog.com/Husiwa/comments/135700.html</wfw:comment><comments>http://www.cppblog.com/Husiwa/archive/2010/12/07/135700.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Husiwa/comments/commentRss/135700.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Husiwa/services/trackbacks/135700.html</trackback:ping><description><![CDATA[今天写一个小程序出现了这种问题：<br>&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(91) : warning C4005: &#8220;AF_IPX&#8221;: 宏重定义<br>1&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(460) : 参见&#8220;AF_IPX&#8221;的前一个定义<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(127) : warning C4005: &#8220;AF_MAX&#8221;: 宏重定义<br>1&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(479) : 参见&#8220;AF_MAX&#8221;的前一个定义<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(163) : warning C4005: &#8220;SO_DONTLINGER&#8221;: 宏重定义<br>1&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(402) : 参见&#8220;SO_DONTLINGER&#8221;的前一个定义<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(206) : error C2011: &#8220;sockaddr&#8221;: &#8220;struct&#8221;类型重定义<br>1&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(485) : 参见&#8220;sockaddr&#8221;的声明<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2143: 语法错误 : 缺少&#8220;}&#8221;(在&#8220;常量&#8221;的前面)<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2143: 语法错误 : 缺少&#8220;;&#8221;(在&#8220;常量&#8221;的前面)<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2059: 语法错误 : &#8220;常量&#8221;<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C2143: 语法错误 : 缺少&#8220;;&#8221;(在&#8220;}&#8221;的前面)<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(518) : warning C4005: &#8220;IN_CLASSA&#8221;: 宏重定义<br>1&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(287) : 参见&#8220;IN_CLASSA&#8221;的前一个定义<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(524) : warning C4005: &#8220;IN_CLASSB&#8221;: 宏重定义<br>1&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(293) : 参见&#8220;IN_CLASSB&#8221;的前一个定义<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(530) : warning C4005: &#8220;IN_CLASSC&#8221;: 宏重定义<br>1&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(299) : 参见&#8220;IN_CLASSC&#8221;的前一个定义<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(541) : warning C4005: &#8220;INADDR_ANY&#8221;: 宏重定义<br>1&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(304) : 参见&#8220;INADDR_ANY&#8221;的前一个定义<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(543) : warning C4005: &#8220;INADDR_BROADCAST&#8221;: 宏重定义<br>1&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(306) : 参见&#8220;INADDR_BROADCAST&#8221;的前一个定义<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(577) : error C2011: &#8220;sockaddr_in&#8221;: &#8220;struct&#8221;类型重定义<br>1&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(312) : 参见&#8220;sockaddr_in&#8221;的声明<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(132) : error C2011: &#8220;fd_set&#8221;: &#8220;struct&#8221;类型重定义<br>1&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(68) : 参见&#8220;fd_set&#8221;的声明<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(167) : warning C4005: &#8220;FD_SET&#8221;: 宏重定义<br>1&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(102) : 参见&#8220;FD_SET&#8221;的前一个定义<br>1&gt;c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(176) : error C2011: &#8220;timeval&#8221;: &#8220;struct&#8221;类型重定义<br>1&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(111) : 参见&#8220;timeval&#8221;的声明<br><br><br>好久没写TCP的程序了，都忘记是怎么回事了，隐约记得解决方法很简单。搜索了一下，记录下来：<br><br>引用链接：<a href="http://www.cnblogs.com/tonyyang132/archive/2009/10/14/1583110.html">http://www.cnblogs.com/tonyyang132/archive/2009/10/14/1583110.html</a><br><br><span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class=Apple-style-span style="FONT-SIZE: 14px; COLOR: rgb(57,57,57); LINE-HEIGHT: 21px; FONT-FAMILY: verdana, 'ms song', Arial, Helvetica, sans-serif; TEXT-ALIGN: left">初看到如此一堆的错误委实不爽，但是只要将二者的包含顺序调换一下问题就会解决，原因参见下面那个链接。另外，上述问题不仅影响直接包含二者的文件，还影响间接包含的情形。比如，a.h包含了windows.h，b.h包含了winsock2.h，如果在c.h当中要引用a.h和b.h，那么正确的顺序应当是b.h先于a.h。当然，实践当中有时很难找到究竟是哪两个文件顺序不对了，终极的解决办法是，在当前工程（就是编译不过的这个工程）所有include语句最前面加上#include &lt;winsock2.h&gt;和#include&lt;windows.h&gt;，世界清静了。<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"></span></span><br><br><span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class=Apple-style-span style="FONT-SIZE: 14px; COLOR: rgb(57,57,57); LINE-HEIGHT: 21px; FONT-FAMILY: verdana, 'ms song', Arial, Helvetica, sans-serif; TEXT-ALIGN: left"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 14pt; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" color=#000066><strong style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">关于WINSOCK.H与winsock2.h中的重定义解决办法分析</strong></font>
<div id=art style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 15px; PADDING-TOP: 0px">
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">问题描述：在 VC 6.0中使用socket相关的函数时没有什么问题，可是到了.net下就有以下类似的错误，
<div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" color=#990000>[C++ Error] winsock2.h(109): E2238 Multiple declaration for 'fd_set'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock.h(54): E2344 Earlier declaration of 'fd_set'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock2.h(112): E2146 Need an identifier to declare<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Warning] winsock2.h(144): W8017 Redefinition of 'FD_SET' is not identical<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock2.h(153): E2238 Multiple declaration for 'timeval'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock.h(97): E2344 Earlier declaration of 'timeval'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock2.h(209): E2238 Multiple declaration for 'hostent'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock.h(153): E2344 Earlier declaration of 'hostent'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock2.h(222): E2238 Multiple declaration for 'netent'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock.h(166): E2344 Earlier declaration of 'netent'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock2.h(229): E2238 Multiple declaration for 'servent'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock.h(173): E2344 Earlier declaration of 'servent'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock2.h(241): E2238 Multiple declaration for 'protoent'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock.h(185): E2344 Earlier declaration of 'protoent'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock2.h(327): E2238 Multiple declaration for 'in_addr'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock.h(269): E2344 Earlier declaration of 'in_addr'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock2.h(385): E2238 Multiple declaration for 'sockaddr_in'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock.h(319): E2344 Earlier declaration of 'sockaddr_in'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock2.h(395): E2238 Multiple declaration for 'WSAData'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock.h(329): E2344 Earlier declaration of 'WSAData'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock2.h(411): E2146 Need an identifier to declare<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Warning] winsock2.h(455): W8017 Redefinition of 'SO_DONTLINGER' is not identical<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Warning] winsock2.h(512): W8017 Redefinition of 'AF_IPX' is not identical<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Warning] winsock2.h(540): W8017 Redefinition of 'AF_MAX' is not identical<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock2.h(546): E2238 Multiple declaration for 'sockaddr'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock.h(492): E2344 Earlier declaration of 'sockaddr'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock2.h(586): E2238 Multiple declaration for 'sockproto'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock.h(501): E2344 Earlier declaration of 'sockproto'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock2.h(625): E2238 Multiple declaration for 'linger'<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[C++ Error] winsock2.h(625): E2228 Too many error or warning messages</font></div>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 5px auto; TEXT-INDENT: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" color=#0000ff>Solution：</font></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 5px auto; TEXT-INDENT: 0px; PADDING-TOP: 0px">This problem arises because<span class=Apple-converted-space>&nbsp;</span><tt style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=新宋体>windows.h</font></tt><span class=Apple-converted-space>&nbsp;</span>(at least, that version of it) includes not<span class=Apple-converted-space>&nbsp;</span><tt style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=新宋体>winsock2.h</font></tt><span class=Apple-converted-space>&nbsp;</span>but<span class=Apple-converted-space>&nbsp;</span><tt style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=新宋体>winsock.h</font></tt>; sadly when Microsoft wrote<span class=Apple-converted-space>&nbsp;</span><tt style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=新宋体>winsock2.h</font></tt><span class=Apple-converted-space>&nbsp;</span>they chose neither to change<span class=Apple-converted-space>&nbsp;</span><tt style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=新宋体>windows.h</font></tt><span class=Apple-converted-space>&nbsp;</span>to include<span class=Apple-converted-space>&nbsp;</span><tt style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=新宋体>winsock2.h</font></tt>, which replaces<span class=Apple-converted-space>&nbsp;</span><tt style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=新宋体>winsock.h</font></tt>, nor to include<span class=Apple-converted-space>&nbsp;</span><tt style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=新宋体>windows.h</font></tt><span class=Apple-converted-space>&nbsp;</span>from<span class=Apple-converted-space>&nbsp;</span><tt style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=新宋体>winsock2.h</font></tt><span class=Apple-converted-space>&nbsp;</span>and then add the definitions for the new Winsock 2 API methods &amp; 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 making<span class=Apple-converted-space>&nbsp;</span><tt style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=新宋体>winsock2.h</font></tt><span class=Apple-converted-space>&nbsp;</span>standalone).</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 5px auto; TEXT-INDENT: 0px; PADDING-TOP: 0px"><strong style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">The fix</strong><span class=Apple-converted-space>&nbsp;</span>is thankfully simple: always "<tt style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=新宋体>#include &lt;winsock2.h&gt;</font></tt>"<span class=Apple-converted-space>&nbsp;</span><em style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">before</em><span class=Apple-converted-space>&nbsp;</span><tt style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=新宋体>windows.h</font></tt>.</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 5px auto; TEXT-INDENT: 0px; PADDING-TOP: 0px">However, you must remember that if<span class=Apple-converted-space>&nbsp;</span><tt style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=新宋体>windows.h</font></tt><span class=Apple-converted-space>&nbsp;</span>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.</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 5px auto; TEXT-INDENT: 0px; PADDING-TOP: 0px">It is however rarely necessary to modify the header files of libraries or other code modules you are using just because<span class=Apple-converted-space>&nbsp;</span><em style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">you</em><span class=Apple-converted-space>&nbsp;</span>include<span class=Apple-converted-space>&nbsp;</span><em style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">their</em><span class=Apple-converted-space>&nbsp;</span>header files, and<span class=Apple-converted-space>&nbsp;</span><em style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">their</em><span class=Apple-converted-space>&nbsp;</span>header files include<span class=Apple-converted-space>&nbsp;</span><tt style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=新宋体>windows.h</font></tt><span class=Apple-converted-space>&nbsp;</span>- you can just include<span class=Apple-converted-space>&nbsp;</span><tt style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=新宋体>winsock2.h</font></tt><span class=Apple-converted-space>&nbsp;</span>before you include the library's header files.</p>
<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 5px auto; TEXT-INDENT: 0px; PADDING-TOP: 0px">在包含jrtplib有时候我也遇到这个问题，解决方法与之相同。一句话，在#include&lt;windows.h&gt;之前 #include &lt;winsock2.h&gt; 问题就可以解决。<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 5px auto; TEXT-INDENT: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=宋体><strong style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">问题描述]<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"></strong>&nbsp;&nbsp; 在包含了&lt;windows.h&gt;以及&lt;winsock2.h&gt;的工程中,编译有时会出现如<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">下错误:</font><br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=宋体>&nbsp;&nbsp;&nbsp;&nbsp; error C2011: 'fd_set' : 'struct' type redefinition<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp; error C2011: 'timeval' : 'struct' type redefinition<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp; error C2375: 'accept' : redefinition; different linkage<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><strong style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[原因分析]<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"></strong>&nbsp;&nbsp; 主要原因是因为&lt;windows.h&gt;中包含了&lt;winsock.h&gt;头文件,由于其版<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">本的不同，导致出</font><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=宋体>现上述的错误。&lt;windows.h&gt;中相关代码如下:<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #ifndef WIN32_LEAN_AND_MEAN<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;cderr.h&gt;<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;dde.h&gt;<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;ddeml.h&gt;<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ........<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #ifndef _MAC<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;winperf.h&gt;<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;winsock.h&gt;<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endif<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .......</font><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=宋体><br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;commdlg.h&gt;<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endif<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endif<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"><strong style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">[解决方案]<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px"></strong>&nbsp;&nbsp;&nbsp; 由以上代码可以看出如果在没有定义WIN32_LEAN_AND_MEAN宏</font><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=宋体>的大前<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">提下windows.h有可能包含winsock.h 头文件，因此我们得出一个很简单<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">的解决方</font><font style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" face=宋体>法就是在包含&lt;windows.h&gt;之前定义WIN32_LEAN_AND_MEAN宏,如<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">下所示:<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">#define WIN32_LEAN_AND_MEAN<br style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px">#include &lt;windows.h&gt;</font></p>
</div>
</div>
</span></span>
<img src ="http://www.cppblog.com/Husiwa/aggbug/135700.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Husiwa/" target="_blank">Husiwa</a> 2010-12-07 15:30 <a href="http://www.cppblog.com/Husiwa/archive/2010/12/07/135700.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>