﻿<?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++博客-在寒风中叶落-随笔分类-程序</title><link>http://www.cppblog.com/Backkom-Li/category/2262.html</link><description>    --Backkom-Li</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 23:27:14 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 23:27:14 GMT</pubDate><ttl>60</ttl><item><title>关于默认初始化</title><link>http://www.cppblog.com/Backkom-Li/archive/2008/02/28/43386.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Thu, 28 Feb 2008 06:16:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2008/02/28/43386.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/43386.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2008/02/28/43386.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/43386.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/43386.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">::std;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">in&nbsp;function&nbsp;,will&nbsp;be&nbsp;initialized.Include&nbsp;main&nbsp;fuction.<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">out&nbsp;of&nbsp;function,&nbsp;willn't&nbsp;be.&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;fun()<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img id=Codehighlighter1_143_296_Open_Image onclick="this.style.display='none'; Codehighlighter1_143_296_Open_Text.style.display='none'; Codehighlighter1_143_296_Closed_Image.style.display='inline'; Codehighlighter1_143_296_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_143_296_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_143_296_Closed_Text.style.display='none'; Codehighlighter1_143_296_Open_Image.style.display='inline'; Codehighlighter1_143_296_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_143_296_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_143_296_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img id=Codehighlighter1_161_162_Open_Image onclick="this.style.display='none'; Codehighlighter1_161_162_Open_Text.style.display='none'; Codehighlighter1_161_162_Closed_Image.style.display='inline'; Codehighlighter1_161_162_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_161_162_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_161_162_Closed_Text.style.display='none'; Codehighlighter1_161_162_Open_Image.style.display='inline'; Codehighlighter1_161_162_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;A[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_161_162_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_161_162_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">call&nbsp;initialize</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #008000"><img id=Codehighlighter1_198_200_Open_Image onclick="this.style.display='none'; Codehighlighter1_198_200_Open_Text.style.display='none'; Codehighlighter1_198_200_Closed_Image.style.display='inline'; Codehighlighter1_198_200_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_198_200_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_198_200_Closed_Text.style.display='none'; Codehighlighter1_198_200_Open_Image.style.display='inline'; Codehighlighter1_198_200_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;C[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_198_200_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_198_200_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">funA:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">A[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">A[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">funC:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">C[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">C[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;B[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img id=Codehighlighter1_319_506_Open_Image onclick="this.style.display='none'; Codehighlighter1_319_506_Open_Text.style.display='none'; Codehighlighter1_319_506_Closed_Image.style.display='inline'; Codehighlighter1_319_506_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_319_506_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_319_506_Closed_Text.style.display='none'; Codehighlighter1_319_506_Open_Image.style.display='inline'; Codehighlighter1_319_506_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_319_506_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_319_506_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;A[</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">];</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;in&nbsp;main&nbsp;function</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">18</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;fun();<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">main&nbsp;funA:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">A[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">A[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">GlobalB:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">B[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">B[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<img height=121 alt="" src="http://www.cppblog.com/images/cppblog_com/backkom-li/网络日志图片/08_02_28_2.jpg" width=272 border=0><br>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/43386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2008-02-28 14:16 <a href="http://www.cppblog.com/Backkom-Li/archive/2008/02/28/43386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于条件表达式 ? :</title><link>http://www.cppblog.com/Backkom-Li/archive/2008/02/28/43384.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Thu, 28 Feb 2008 05:46:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2008/02/28/43384.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/43384.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2008/02/28/43384.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/43384.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/43384.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;b</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,&nbsp;c&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,&nbsp;d&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,&nbsp;e&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;f&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>e&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;b</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(c&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,&nbsp;d&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:(c&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">,&nbsp;d&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">,&nbsp;f);<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">c</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">d</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">e;&nbsp;</span></div>
<img height=54 alt="" src="http://www.cppblog.com/images/cppblog_com/backkom-li/网络日志图片/08_02_28.JPG" width=244 border=0> 
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/43384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2008-02-28 13:46 <a href="http://www.cppblog.com/Backkom-Li/archive/2008/02/28/43384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串数组以及结构体</title><link>http://www.cppblog.com/Backkom-Li/archive/2008/01/29/42148.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Tue, 29 Jan 2008 12:45:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2008/01/29/42148.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/42148.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2008/01/29/42148.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/42148.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/42148.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img id=Codehighlighter1_15_32_Open_Image onclick="this.style.display='none'; Codehighlighter1_15_32_Open_Text.style.display='none'; Codehighlighter1_15_32_Closed_Image.style.display='inline'; Codehighlighter1_15_32_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_15_32_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_15_32_Closed_Text.style.display='none'; Codehighlighter1_15_32_Open_Image.style.display='inline'; Codehighlighter1_15_32_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;test[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_15_32_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_15_32_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">123</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a,b,c,&nbsp;d,&nbsp;e;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(test);<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;b&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(test[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]);<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;c&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(test[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]);<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;d&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(test[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">]);<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;e&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;a</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">b;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;f&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;test[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">][</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;g&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;test[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">][</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;h&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;test[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">][</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;test[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">][</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">a%d,b%d,c%d,d%d,e%d,&nbsp;f%d,&nbsp;g%d,&nbsp;h%d,&nbsp;i%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;a,&nbsp;b,&nbsp;c,&nbsp;d,&nbsp;e,&nbsp;f,&nbsp;g,&nbsp;h,&nbsp;i);<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;typedef&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img id=Codehighlighter1_334_363_Open_Image onclick="this.style.display='none'; Codehighlighter1_334_363_Open_Text.style.display='none'; Codehighlighter1_334_363_Closed_Image.style.display='inline'; Codehighlighter1_334_363_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_334_363_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_334_363_Closed_Text.style.display='none'; Codehighlighter1_334_363_Open_Image.style.display='inline'; Codehighlighter1_334_363_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;</span><span id=Codehighlighter1_334_363_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_334_363_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;a[</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;b[</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000">teststruct;<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img id=Codehighlighter1_393_402_Open_Image onclick="this.style.display='none'; Codehighlighter1_393_402_Open_Text.style.display='none'; Codehighlighter1_393_402_Closed_Image.style.display='inline'; Codehighlighter1_393_402_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_393_402_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_393_402_Closed_Text.style.display='none'; Codehighlighter1_393_402_Open_Image.style.display='inline'; Codehighlighter1_393_402_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;teststruct&nbsp;t1</span><span style="COLOR: #000000">=</span><span id=Codehighlighter1_393_402_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_393_402_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img id=Codehighlighter1_427_483_Open_Image onclick="this.style.display='none'; Codehighlighter1_427_483_Open_Text.style.display='none'; Codehighlighter1_427_483_Closed_Image.style.display='inline'; Codehighlighter1_427_483_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_427_483_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_427_483_Closed_Text.style.display='none'; Codehighlighter1_427_483_Open_Image.style.display='inline'; Codehighlighter1_427_483_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;teststruct&nbsp;testst[]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_427_483_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_427_483_Open_Text><span style="COLOR: #000000">{</span><span id=Codehighlighter1_428_437_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_428_437_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">,</span><span id=Codehighlighter1_439_450_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_439_450_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ab</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">,</span><span id=Codehighlighter1_452_465_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_452_465_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">123</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">abc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">,</span><span id=Codehighlighter1_467_482_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_467_482_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1234</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">abcd</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;teststruct&nbsp;t2;<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s,&nbsp;%s,&nbsp;%s,&nbsp;%s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;t2.a,&nbsp;t2.b,&nbsp;t1.a,&nbsp;t1.b);<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d,&nbsp;%d,&nbsp;%d,&nbsp;%d,&nbsp;%d,&nbsp;%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;testst[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].a[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">],&nbsp;testst[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].b[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">],&nbsp;testst[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].a[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">],&nbsp;testst[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].b[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">],&nbsp;testst[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].a[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">],&nbsp;testst[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">].b[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]);<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<img height=51 alt="" src="http://www.cppblog.com/images/cppblog_com/backkom-li/网络日志图片/080129.JPG" width=280 border=0>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/42148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2008-01-29 20:45 <a href="http://www.cppblog.com/Backkom-Li/archive/2008/01/29/42148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] C++中extern “C”含义深层探索</title><link>http://www.cppblog.com/Backkom-Li/archive/2007/11/20/37028.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Tue, 20 Nov 2007 09:39:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2007/11/20/37028.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/37028.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2007/11/20/37028.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/37028.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/37028.html</trackback:ping><description><![CDATA[<font size=2><strong>1.引言<br><br></strong>　　C++语言的创建初衷是&#8220;a better C&#8221;，但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言，C++保留了一部分过程式语言的特点（被世人称为&#8220;不彻底地面向对象&#8221;），因而它可以定义不属于任何类的全局变量和函数。但是，C++毕竟是一种面向对象的程序设计语言，为了支持函数的重载，C++对全局函数的处理方式与C有明显的不同。</font>
<p><font size=2><strong>2.从标准头文件说起</strong><br>某企业曾经给出如下的一道面试题：为什么标准头文件都有类似以下的结构？ <br></font></p>
<p><font size=2></font></p>
<p clear=both><font size=2></font></p>
<p class=code><font size=2>#ifndef __INCvxWorksh<br>#define __INCvxWorksh <br>#ifdef __cplusplus<br>extern "C" {<br>#endif <br>/*...*/ <br>#ifdef __cplusplus<br>}<br>#endif <br>#endif /* __INCvxWorksh */</font></p>
<p class=code><font size=2>显然，头文件中的编译宏&#8220;#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif&#8221; 的作用是防止该头文件被重复引用。那么</font></p>
<p class=code><br><font size=2>#ifdef __cplusplus<br>extern "C" {<br>#endif <br>#ifdef __cplusplus<br>}<br>#endif </font></p>
<p><font size=2>的作用又是什么呢？我们将在下文一一道来。</font></p>
<p><font size=2><strong>3.深层揭密extern "C"<br><br></strong>　　extern "C" 包含双重含义，从字面上即可得到：首先，被它修饰的目标是&#8220;extern&#8221;的；其次，被它修饰的目标是&#8220;C&#8221;的。让我们来详细解读这两重含义。<br><br>　　被extern "C"限定的函数或变量是extern类型的；<br><br>　　extern是C/C++语言中表明函数和全局变量作用范围（可见性）的关键字，该关键字告诉编译器，其声明的函数和变量可以在本模块或其它模块中使用。记住，下列语句：<br></font></p>
<p class=code><font size=2>　　extern int a;</font></p>
<p><br><font size=2>　　仅仅是一个变量的声明，其并不是在定义变量a，并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次，否则会出现连接错误。<br><br>　　通常，在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如，如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样，模块B中调用模块A中的函数时，在编译阶段，模块B虽然找不到该函数，但是并不会报错；它会在连接阶段中从模块A编译生成的目标代码中找到此函数。<br><br>　　与extern对应的关键字是static，被它修饰的全局变量和函数只能在本模块中使用。因此，一个函数或变量只可能被本模块使用时，其不可能被extern &#8220;C&#8221;修饰。<br><br>　　被extern "C"修饰的变量和函数是按照C语言方式编译和连接的；<br><br>　　<strong>未加extern &#8220;C&#8221;声明时的编译方式</strong><br><br>　　首先看看C++中对类似C的函数是怎样编译的。<br><br>　　作为一种面向对象的语言，C++支持函数重载，而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如，假设某个函数的原型为： <br></font></p>
<p class=code><font size=2>void foo( int x, int y );</font></p>
<p><br><font size=2>　　该函数被C编译器编译后在符号库中的名字为_foo，而C++编译器则会产生像_foo_int_int之类的名字（不同的编译器可能生成的名字不同，但是都采用了相同的机制，生成的新名字称为&#8220;mangled name&#8221;）。<br><br>　　<span style="COLOR: #ff00ff">_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息，C++就是靠这种机制来实现函数重载的。</span>例如，在C++中，函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的，后者为_foo_int_float。</font></p>
<p><font size=2>同样地，C++中的变量除支持局部变量外，还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名，我们以"."来区分。而本质上，编译器在进行编译时，与函数的处理相似，也为类中的变量取了一个独一无二的名字，这个名字与用户程序中同名的全局变量名字不同。<br><br>　　<strong>未加extern "C"声明时的连接方式</strong><br><br>　　假设在C++中，模块A的头文件如下：<br></font></p>
<p class=code><font size=2>// 模块A头文件　moduleA.h<br>#ifndef MODULE_A_H<br>#define MODULE_A_H<br>int foo( int x, int y );<br>#endif</font></p>
<p><br><font size=2>　　在模块B中引用该函数：<br></font></p>
<p class=code><font size=2>// 模块B实现文件　moduleB.cpp<br>#include "moduleA.h"<br>foo(2,3);</font></p>
<p><br><font size=2>　　实际上，<span style="COLOR: #ff00ff">在连接阶段，连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号！</span><br><br>　　<strong>加extern "C"声明后的编译和连接方式</strong><br><br>　　加extern "C"声明后，模块A的头文件变为：<br></font></p>
<p class=code><font size=2>// 模块A头文件　moduleA.h<br>#ifndef MODULE_A_H<br>#define MODULE_A_H<br>extern "C" int foo( int x, int y );<br>#endif</font></p>
<p><br><font size=2>　　在模块B的实现文件中仍然调用foo( 2,3 )，其结果是：<br><br>　　（1）模块A编译生成foo的目标代码时，没有对其名字进行特殊处理，采用了C语言的方式；<br><br>　　（2）连接器在为模块B的目标代码寻找foo(2,3)调用时，寻找的是未经修改的符号名_foo。<br><br>　　如果在模块A中函数声明了foo为extern "C"类型，而模块B中包含的是extern int foo( int x, int y ) ，则模块B找不到模块A中的函数；反之亦然。<br><br>　　所以，可以用一句话概括extern &#8220;C&#8221;这个声明的真实目的（任何语言中的任何语法特性的诞生都不是随意而为的，来源于真实世界的需求驱动。我们在思考问题时，不能只停留在这个语言是怎么做的，还要问一问它为什么要这么做，动机是什么，这样我们可以更深入地理解许多问题）：<br>　　实现C++与C及其它语言的混合编程。<br>　　明白了C++中extern "C"的设立动机，我们下面来具体分析extern "C"通常的使用技巧。</font></p>
<p><font size=2><strong>4.extern "C"的惯用法<br><br></strong>　　（1）在C++中引用C语言中的函数和变量，在包含C语言头文件（假设为cExample.h）时，需进行下列处理：<br></font></p>
<p class=code><font size=2>extern "C"<br>{<br>#include "cExample.h"<br>}</font></p>
<p><br><font size=2>　　而在C语言的头文件中，对其外部函数只能指定为extern类型，C语言中不支持extern "C"声明，在.c文件中包含了extern "C"时会出现编译语法错误。<br><br>　　笔者编写的C++引用C函数例子工程中包含的三个文件的源代码如下：<br></font></p>
<p class=code><font size=2>/* c语言头文件：cExample.h */<br>#ifndef C_EXAMPLE_H<br>#define C_EXAMPLE_H<br>extern int add(int x,int y);<br>#endif<br>/* c语言实现文件：cExample.c */<br>#include "cExample.h"<br>int add( int x, int y )<br>{<br>return x + y;<br>}<br>// c++实现文件，调用add：cppFile.cpp<br>extern "C" <br>{<br>#include "cExample.h"<br>}<br>int main(int argc, char* argv[])<br>{<br>add(2,3); <br>return 0;<br>}</font></p>
<p><br><font size=2>　　如果C++调用一个C语言编写的.DLL时，当包括.DLL的头文件或声明接口函数时，应加extern "C" {　}。<br><br>　　（2）在C中引用C++语言中的函数和变量时，C++的头文件需添加extern "C"，但是在C语言中不能直接引用声明了extern "C"的该头文件，应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。<br>　　笔者编写的C引用C++函数例子工程中包含的三个文件的源代码如下：<br></font></p>
<p class=code><font size=2>//C++头文件 cppExample.h<br>#ifndef CPP_EXAMPLE_H<br>#define CPP_EXAMPLE_H<br>extern "C" int add( int x, int y );<br>#endif<br>//C++实现文件 cppExample.cpp<br>#include "cppExample.h"<br>int add( int x, int y )<br>{<br>return x + y;<br>}<br>/* C实现文件 cFile.c<br>/* 这样会编译出错：#include "cExample.h" */<br>extern int add( int x, int y );<br>int main( int argc, char* argv[] )<br>{<br>add( 2, 3 ); <br>return 0;<br>}</font></p>
<p><br><font size=2>　　如果深入理解了第3节中所阐述的extern "C"在编译和连接阶段发挥的作用，就能真正理解本节所阐述的从C++引用C函数和C引用C++函数的惯用法。对第4节给出的示例代码，需要特别留意各个细节。<br></font></p>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=763734</p>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/37028.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2007-11-20 17:39 <a href="http://www.cppblog.com/Backkom-Li/archive/2007/11/20/37028.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于sizeof</title><link>http://www.cppblog.com/Backkom-Li/archive/2006/12/13/16389.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Wed, 13 Dec 2006 12:12:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2006/12/13/16389.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/16389.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2006/12/13/16389.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/16389.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/16389.html</trackback:ping><description><![CDATA[
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Codehighlighter1_1_18_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1_18_Open_Text.style.display='none'; Codehighlighter1_1_18_Closed_Image.style.display='inline'; Codehighlighter1_1_18_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_1_18_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1_18_Closed_Text.style.display='none'; Codehighlighter1_1_18_Open_Image.style.display='inline'; Codehighlighter1_1_18_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #000000">    </span>
				<span id="Codehighlighter1_1_18_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span>
				<span id="Codehighlighter1_1_18_Open_Text">
						<span style="COLOR: #008000">/*</span>
						<span style="COLOR: #008000">char 是最小的可操作单元</span>
						<span style="COLOR: #008000">*/</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> str[</span>
				<span style="COLOR: #000000">20</span>
				<span style="COLOR: #000000">]</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">987654321</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">ch </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> str;<br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">test </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">987654321</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">;</span>
		</div>
		<img height="186" alt="sizeof.jpg" src="http://www.cppblog.com/images/cppblog_com/backkom-li/sizeof.jpg" width="535" border="0" />
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/16389.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2006-12-13 20:12 <a href="http://www.cppblog.com/Backkom-Li/archive/2006/12/13/16389.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从别人那转的:100本计算机经典书籍下载URL </title><link>http://www.cppblog.com/Backkom-Li/archive/2006/09/21/12802.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Thu, 21 Sep 2006 12:02:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2006/09/21/12802.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/12802.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2006/09/21/12802.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/12802.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/12802.html</trackback:ping><description><![CDATA[
		<div class="posthead">
				<font size="2">1.vc++技术内幕第四版 (潘爱民) <br />ftp://210.32.157.56/课件/c++primer/vc++技术内幕IV(潘爱民).rar <br />2.C++经典对话系列 <br />中文：http://www.jka77.com/book/cvst_cn.chm <br /><br />3.MFC Windows 程序设计(第二版) <br />英文版：http://www.jka77.com/book/progmfc2.chm <br />中文版：暂无，制作中... <br />4.Effective C++中文版： <br />http://dlb.pchome.net/development/reference/effectiveCplus.zip <br />5.More Effective C++中文版-zhc译 <br />http://cable.pchome.net/development/reference/MEC0410.zip <br /><br />6.More Effective C++中文版-候捷译 <br />http://www.nethovel.com/resources/MoreEffectiveC++(WQ).zip <br /><br />7.Essential C++中文版(全)－候捷译 <br />http://www.nethovel.com/resources/Essential%20C++中文版(全).rar <br /><br />8.深入浅出MFC 2/e <br />http://218.30.21.125:8084/ebook/programme/mfc2e.zip <br /><br />9.代码大全中文版 <br />http://www.delphidevelopers.com/docs/tecsubject/cc/CodeComplet110.zip <br /><br />11.C++经典对话系列 <br />中文：http://www.jka77.com/book/cvst_cn.chm <br /><br />12.MFC Windows 程序设计(第二版) <br />英文版：http://www.jka77.com/book/progmfc2.chm <br />中文版：暂无，制作中... <br /><br />13.数据结构 C++ 语言描述(中文版) <br />http://www.code-labs.com/manual/c_c015.zip <br /><br />14.Java编程思想中文版 <br />ftp://202.118.72.12/pub/doc-book/Java/Java编程思想.zip <br /><br />15.C++标准库英文版 <br />ftp://166.111.64.4/incoming/新文件夹/f/The%20C++%20Standard%20Library(with%20TOC).pdf <br /><br />16.Windows核心编程 <br />英文：http://www.fmdstudio.net/book/prgapps4.zip <br /><br />17.TCP-IP详解卷1：协议 <br />ftp://202.204.4.161/学习资料/TCPIP/TCP-IP详解卷1：协议.pdf <br /><br />18.TCP-IP详解卷2：实现 <br />ftp://202.204.4.161/学习资料/TCPIP/TCP-IP详解卷3：TCP事务协议，HTTP，NNTP.pdf <br /><br />19.TCP-IP详解卷3：TCP事务协议 <br />ftp://202.204.4.161/学习资料/TCPIP/TCP-IP详解卷2：实现.pdf <br /><br />20.实用算法的分析与程序设计 <br />ftp://202.204.8.10/[4]%20编程资源/[%20书籍资料%20]/[算法与数据结构]/实用算法的分析与程序设计.rar <br /><br />21.vc++技术内幕第四版 (潘爱民) <br />ftp://210.32.157.56/课件/c++primer/vc++技术内幕IV(潘爱民).rar <br /><br />22.C++ Primer英文版： <br />http://computerstep.w18.net/C/C++%20Primer.zip <br /><br />23.Effective C++中文版： <br />http://dlb.pchome.net/development/reference/effectiveCplus.zip <br /><br />24.More Effective C++中文版-zhc译 <br />http://cable.pchome.net/development/reference/MEC0410.zip <br /><br />25.More Effective C++中文版-候捷译 <br />http://www.nethovel.com/resources/MoreEffectiveC++(WQ).zip <br /><br />26.Essential C++中文版(全)－候捷译 <br />http://www.nethovel.com/resources/Essential%20C++中文版(全).rar <br /><br />27.Programming Windows程式开发设计指南－Petzoldi著 余孟学 译 <br />中文版：http://www.nethovel.com/resources/ProgrammingWindows_tw.chm <br />英文版：http://www.nethovel.com/resources/Petzoldi.chm <br /><br />28.WinAsm32汇编教程－ Iczelion <br />http://www.nethovel.com/resources/winasm.chm <br /><br />29.Windows 95 程序设计指南－候捷译 <br />http://www.nethovel.com/resources/win95adg.zip <br /><br />30.Thinking in C++ 2nd Edition(C++编程思想) <br />英文版：http://www.nethovel.com/resources/ThinkinginC++.zip <br />中文版：http://www.dingbing.com/book/thinkc.zip <br /><br />31.人月神话－中文版 <br />http://www.goodassister.com/book/rysh.pdf <br /><br />32.The C++ Programming Language英文 <br />http://computerstep.w18.net/C/The%20C++%20Programming%20Language.rar <br /><br />33.VC技术内幕第五版 http://www.helpwork.com/downdata/book/programming/vc/book/vc++2/invcpp5.chm <br /><br />34.com技术内幕 <br />http://www.helpwork.com/book/html/user/download.asp?id=1123 <br /><br />35.com＋技术内幕 <br />http://www.helpwork.com/book/html/user/download.asp?id=952 <br /><br />36.新编 Windows API参考大全 <br />http://www.4046.com/nnsrc/down/WindowsAPIdq.rar <br /><br />37.The C programming Language // By Brian W. Kernighan and Dennis M. Ritchie <br />下载地址：http://www.jka77.com/book/The_C_programmin.chm <br /><br />38.C语言编程手册 <br />下载地址：http://www.jka77.com/book/CL.chm <br /><br />39.Delphi 7高效数据库程序设计 <br />By 李维 <br />下载地址:http://www.codestudy.net/book/download.asp?id=1163&amp;sort=5 <br /><br />40.Windows网络编程(第2版) <br />By Anthony Jones,Jim Ohlund 清华大学出版社 <br />下载地址：英文版:http://www.guxiang.com/epubcn/readings/diannaotushu/500/download/1107/network_prog_for_win_2nd.zip <br /><br />41.Windows2000编程技术内幕 <br />By Mickey Williams 机械工业出版社 <br />下载地址：ftp://ftp.frontfree.net/Pub/Books/C&amp;C++/VC/Windows2000编程技术内幕.rar <br /><br />42.数据仓库 <br />By W.H.Inmon 清华大学出版社 <br />下载地址1：http://tips.9hao.com/vvbksd/20011120/数据仓库.zip <br />下载地址2: ftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/ComputerScience/%CA%FD%BE%DD%B2%D6%BF%E2/ <br /><br />43.编码的奥秘 <br />By Charles Petzold 机械工业出版社 <br />下载地址：ftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/ComputerScience/%B1%E0%C2%EB%B5%C4%B0%C2%C3%D8/ <br /><br />44.编译原理及实践 <br />By Louden, K.C 机械工业出版社 <br />下载地址：ftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/ComputerScience/%B1%E0%D2%EB%D4%AD%C0%ED%BC%B0%CA%B5%BC%F9/ <br /><br />45.Inside C++ Object Model(深度探索C++对象模型） <br />By Lippman 候捷译 <br />下载地址：http://www.jka77.com/book/inside-the-cpp-object-model.pdf <br /><br />46.C++标准程序库 <br />By Josuttis <br />下载地址1：http://www.codestudy.net/book/download.asp?id=1205&amp;sort=5 <br />下载地址2: ftp://ftp.math.nankai.edu.cn/Ebook/C_C++/The Cpp Standard Library.pdf <br /><br />47.STL源码剖析 <br />By 候捷 <br />下载地址：ftp://ftp.math.nankai.edu.cn/Ebook/C_C++/STL源码剖析--侯捷.pdf <br /><br />48.C++批判(第三版) -看看C++的坏话！ <br />By I don't know <br />下载地址：http://www.jka77.com/book/CPPPP.pdf <br /><br />49.程序设计实践 <br />下载地址：ftp://ftp.math.nankai.edu.cn/Ebook/China-pub/chinapub_computerscience_multimedia/%B3%CC%D0%F2%C9%E8%BC%C6%CA%B5%BC%F9/ <br /><br />50.c++沉思录 <br />By Andrew Koenig Barbara Moo 人民邮电出版社 <br />下载地址：http://www.codestudy.net/book/download.asp?id=1261&amp;sort=5 <br /><br />51.C++Builder4技术内幕 (这本书俺不知道好不好） <br />By I don't Know <br />下载地址：http://www.codestudy.net/book/download.asp?id=1254&amp;sort=5 <br /><br />52.下面两本书一般大家硬盘里都有的吧，而且很老了，但是为了全面，就提上来吧 <br />(1)Windows 95 程式设计指南 - 候捷 <br />下载地址：http://jjhou.csdn.net/win95-a-developers-guide.pdf <br />(2)Windows 95 系统程式设计大奥秘 - 候捷 <br />下载地址：http://jjhou.csdn.net/windows95-system-programming-secrets.pdf <br /><br />53. 中国大百科全书·数学 <br />下载地址：ftp://ftp.math.nankai.edu.cn/Ebook/中国大百科全书/中国大百科全书·数学.pdf <br /><br />54、4.0M Bjarne Stroustrup - The C++ Programming Language <br />http://www.u-n-f.com/books/archive/The%20C++%20Programming%20Language.tar.gz <br /><br />55、1.0M Richard Stevens - TCP-IP Illustrated <br />http://www.u-n-f.com/books/archive/TCP-IP%20Illustrated.tar.gz <br /><br />56、4.5M Randall Hyde - Art Of Assembly <br />http://www.u-n-f.com/books/archive/Randall%20Hyde%20-%20Art%20Of%20Assembly.tar.gz <br /><br />57、2.1M M. Abrash - Zen of Graphics Programming <br />http://www.u-n-f.com/books/archive/M.%20Abrash%20-%20Zen%20of%20Graphics%20Programming.zip <br /><br />58、249k Kernighan and Ritche - The C Programming Language <br />http://www.u-n-f.com/books/archive/Kernighan%20and%20Ritchie%20-%20The%20C%20Programming%20Language.zip <br /><br />59、3.3M Bruce Schneier - Applied Cryptography <br />http://www.u-n-f.com/books/archive/Bruce%20Schneier%20-%20Applied%20Cryptography.zip <br /><br />60、PHP4_Grundlagen_und_Profiwissen <br />http://www.u-n-f.com/books/archive/lamp/PHP4_Grundlagen_und_Profiwissen.pdf <br /><br />61.《C++ Builder高级编程技术》 <br />http://www.dingbing.com/book/builder.zip <br /><br />62.《VC++ 6.0 TLR 模板库参考手册》 <br />http://www.easysea.com/diannao/download/prog/c/mbkc.zip <br /><br />63.《BORLAND C++ BUILDER 实用培训教程》 <br />http://202.101.232.120/book/openfile.asp?id=223&amp;filename=BC98_CB526.zip <br /><br />64.《Delphi高级开发指南》 <br />http://www.pcbookcn.com/s10899book/program/delphi/Delphi_gjkfzn_for3.rar <br /><br />65.《新编 Windows API参考大全》 <br />ftp://book:book@down.pcbookcn.com/pro/delphi/新编Windows_API_参考大全.rar <br /><br />66.《Delphi深度历险-附书源码》 <br />http://www.pcbookcn.com/s10899book/program/delphi/Delphi_sdlx_code.rar <br /><br />67.《Delphi 7高效数据库程序设计》 <br />ftp://book:book@down.pcbookcn.com/pro/delphi/李维的新书《Delphi7高效数据库程序设计》.rar <br /><br />68.《Delphi7开发指南》 <br />ftp://book:book@down.pcbookcn.com/pro/delphi/delphi7开发指南.rar <br /><br />69.《Delphi6集成开发环境》 <br />ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi6集成开发环境.rar <br /><br />70.《Delphi6数据库编程》 <br />ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi6数据库编程.rar <br /><br />72.《Delphi5.xADO_MTS_COM+高级程序设计篇》 <br />ftp://book:book@down.pcbookcn.com/pro/delphi/Delphi5.xADO_MTS_COM+高级程序设计篇.rar <br /><br />73.《VISUAL BASIC 编程标准》 <br />http://www.dingbing.com/book/vb.zip <br /><br />74.《Visual Basic6.0中文版程序员指南》 <br />http://www.easysea.com/diannao/download/prog/vb/zwbc.zip <br /><br />75.《Visual Basic 6.0 控件参考手册》 <br />http://www.easysea.com/diannao/download/prog/vb/kjck.zip <br /><br />76.《Visual Basic 6.0中文版语言参考手册》 <br />http://www.easysea.com/diannao/download/prog/vb/zwby.zip <br /><br />77.《Visual Basic 6.0 开发宝典》 <br />http://www.easysea.com/diannao/download/prog/vb/kfbd.zip <br /><br />78.《Visual Basic 6.0 实例教程》 <br />http://www.easysea.com/diannao/download/prog/vb/sljc.zip <br /><br />79.《VB 6.0 中文版实用参考手册》 <br />http://www.easysea.com/diannao/download/prog/vb/syck.zip <br /><br />80.《Visual Basic 6开发人员指南》 <br />http://www.easysea.com/diannao/download/prog/vb/kfzn.zip <br /><br />81.《VB 和 SQL Server 编程指南（第五版）》 <br />http://www.easysea.com/diannao/download/prog/vb/bczn.zip <br /><br />82.《Jbuilder 5 中文帮助》 <br />http://www.pdown.net/download.asp?downid=2&amp;id=991 <br /><br />83.《JBuilder开发人员指南》 <br />http://youth.dlmu.edu.cn/book/list_down.php?bkid=224 <br /><br />84.《Win32的Internet函数说明》 <br />档案大小： 245248K <br />http://www.easysea.com/diannao/download/prog/windows/win32int.zip <br /><br />85.《Visual InterDev 从入门到精通》 <br />http://www.easysea.com/diannao/download/prog/interdev/crmd.wdl <br /><br />86.《Visual InterDev 6.0 Web 参考手册 》 <br />http://www.easysea.com/diannao/download/prog/interdev/jsck.zip <br /><br />87.《Visual InterDev 6.0 Guide 程序员》 <br />http://www.easysea.com/diannao/download/prog/interdev/cxyz.zip <br /><br />88.《JavaScript 程序开发手册》 <br />http://www.cty99.com/Templet/bookdownmore.asp?booktype=script# <br /><br />89.《JAVA 大全》 <br />http://www.easysea.com/diannao/download/prog/java/cxkf.zip <br /><br />90.《Visual J++ 6.0 WFC 类库参考手册》 <br />http://www.easysea.com/diannao/download/prog/java/lkck.zip <br /><br />91.《Java联想（中文）》 <br />http://www.easysea.com/diannao/download/prog/java/lkck.zip <br /><br />92.《Oracle 8 实用大全》 <br />http://www.easysea.com/diannao/download/prog/oracle/sydq.zip <br /><br />93.《Microsoft SQL Server 管理员手册》 <br />http://www.easysea.com/diannao/download/prog/sql/glys.zip <br /><br />94.《掌握ACCESS开发》 <br />http://www.easysea.com/diannao/download/prog/sql/glys.zip <br /><br />95.《Oracle Performance Tuning and Optimization》 <br />http://www.oradb.net/book/oracle_pt.zip <br /><br />96.《Oracle ProC 程序设计》 <br />http://www.oradb.net/book/oracleproc.zip <br /><br />97.《Oracle8初学者指南》 <br />http://www.easysea.com/diannao/download/prog/oracle/cxzz.zip <br /><br />98.《RED HAT LINUX 6大全》 <br />http://www.dingbing.com/book/redhatall.zip <br /><br />99.《RED HAT LINUX 6管理工具》 <br />http://www.dingbing.com/book/redhatman.zip <br /><br />100.《VC++高级编程》 <br />http://www.easysea.com/diannao/download/prog/c/vcgj.zip<br /></font>
		</div>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/12802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2006-09-21 20:02 <a href="http://www.cppblog.com/Backkom-Li/archive/2006/09/21/12802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些琐记</title><link>http://www.cppblog.com/Backkom-Li/archive/2006/09/07/12117.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Thu, 07 Sep 2006 04:11:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2006/09/07/12117.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/12117.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2006/09/07/12117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/12117.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/12117.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">1、#define INITIAL_STRUCT(st)  memset(&amp;st, 0, sizeof(st))  /*initial a struct*/<br /><br />2、profiler工具可以用来检查程序效率。<br /></font>
		</p>
		<p>
				<font size="2">3、文件A<br />      funtion f</font>
		</p>
		<p>
				<font size="2">      文件B<br />      #include "A"<br />      extern f<br />      此处用法错误，对函数f进行了重定义。</font>
		</p>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/12117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2006-09-07 12:11 <a href="http://www.cppblog.com/Backkom-Li/archive/2006/09/07/12117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个关于结对编程（Pair Programming）的讲义 [转]</title><link>http://www.cppblog.com/Backkom-Li/archive/2006/09/05/12029.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Tue, 05 Sep 2006 00:38:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2006/09/05/12029.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/12029.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2006/09/05/12029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/12029.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/12029.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 什么是Pair Programming				  												Pair Programming是一个编程模式(Programming pattern)。两个程序员并排坐在一台电脑前，面对同一个显示器，使用同一个键盘，同一个鼠标一起工作。他们一起分析，一起设计，一起写测试例子，一起编码，一起单元测试，一起整合测试(Integration Test)，一起写文档等。基本上所...&nbsp;&nbsp;<a href='http://www.cppblog.com/Backkom-Li/archive/2006/09/05/12029.html'>阅读全文</a><img src ="http://www.cppblog.com/Backkom-Li/aggbug/12029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2006-09-05 08:38 <a href="http://www.cppblog.com/Backkom-Li/archive/2006/09/05/12029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于代码效率</title><link>http://www.cppblog.com/Backkom-Li/archive/2006/08/31/11875.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Thu, 31 Aug 2006 00:42:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2006/08/31/11875.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/11875.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2006/08/31/11875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/11875.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/11875.html</trackback:ping><description><![CDATA[
		<font size="2">有个叫profiler的工具，是用来检测代码效率的，现转用法如下，用得着的时候再去学它。<br /><h1>NetBeans IDE 4.1/5.0 Profiler 教程</h1><div class="articledate" style="MARGIN-LEFT: 0px">撰稿和修订人：
<script language="JavaScript" type="text/javascript"><!--
var user = "&#103;&#115;&#112;&#111;&#114;&#97;&#114;";
var domain = "&#110;&#101;&#116;&#98;&#101;&#97;&#110;&#115;&#46;&#111;&#114;&#103;";
var at = "&#x40;";
document.write('<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;' + user + at + domain + '">Gregg Sporar</a>');
//--></script><a href="mailto:gsporar@netbeans.org">Gregg Sporar</a><noscript><a href="mailto:gsporar@netbeans.org">Gregg Sporar</a></noscript>和 <a href="mailto:ruth.kusterer@sun.com">Ruth Kusterer</a>。 </div><p>本文旨在介绍配合使用 NetBeans Profiler v5.0 或 Profiler Milestone 8 的内容。如果您使用的是 Milestone 5，请使用<a href="http://www.netbeans.org/kb/articles/nb-profiler-tutor-5.html">此版本</a>。如果您使用的是 Milestone 6，请使用<a href="http://www.netbeans.org/kb/articles/nb-profiler-tutor-6.html">此版本</a>。</p><p align="center"><b>预计持续时间：50 分钟</b></p><p>NetBeans Profiler 是一个功能强大的工具，它提供了有关应用程序运行时行为的重要信息。NetBeans Profiler 产生的开销相对来说较小，它可以跟踪线程状态、CPU 性能和内存使用情况。本教程将向您介绍如何使用 NetBeans Profiler 来完成以下操作：<br /></p><ul><li>监视应用程序的运行时行为，其中包括： 
<ul><li>堆内存大小 
</li><li>垃圾回收统计信息 
</li><li>线程计数 
</li><li>线程状态：运行、休眠、等待、受阻 </li></ul></li><li>确定应用程序方法使用的 CPU 时间 
</li><li>监视应用程序创建对象的过程 </li></ul><h3>先决条件</h3><p>本教程假定您已经具有了一些基本的 Java 编程和 NetBeans IDE 使用经验。</p><h3>教程所需的软件：</h3><ul><li>下载并安装 Java 2 Platform Standard Edition <a href="http://java.sun.com/j2se/1.5.0/download.jsp">v5.0, Update 4（或更高版本）</a>。请注意，<a href="http://www.netbeans.org/">NetBeans IDE</a> 需要完整的 JDK，而不仅仅是 JRE。请记录此安装目录。 
</li><li>下载并安装 <a href="http://www.netbeans.org/downloads/index.html">NetBeans IDE v4.1 或 v5.0</a>。请记录此安装目录。当系统提示您选择 JDK 时，请指定 v5.0, Update 4（或更高版本的）JDK。 
</li><li>下载并安装用于 NetBeans IDE v5.0 的 <a href="http://profiler.netbeans.org/index_zh_CN.html">NetBeans Profiler v5.0</a>。如果使用的是 NetBeans IDE 4.1，请下载 <a href="http://profiler.netbeans.org/download/m8_zh_CN.html">Milestone 8</a>。<br />Profiler 安装程序会要求您修改 NetBeans IDE 安装；请指定用于 NetBeans IDE 的安装目录。<br />注意：Profiler v5.0 只能与 NetBeans IDE v5.0 一起使用；而 Profiler Milestone 8 只能与 NetBeans IDE v4.1 一起使用。 
</li><li>下载<a href="http://www.netbeans.org/servlets/ProjectDocumentDownload?documentID=569">教程 zip 文件</a>，其中包括练习中使用的项目。 </li></ul><h3>本文使用的表示法</h3><ul><li>&lt;NETBEANS_HOME&gt; - NetBeans IDE 安装目录 
</li><li>&lt;USER_HOME&gt; - 用户的 home 目录 
</li><li>&lt;tutorial_root&gt; - 解压缩教程 zip 文件所在的目录 </li></ul><ol><ul><li>本文使用 &lt;tutorial_root&gt; 来表示解压缩此教程的 zip 文件所在的目录。此教程的 zip 文件的名称为 <b>profilertutorial.zip</b>。 
</li><li>将教程 zip 文件解压缩到 &lt;tutorial_root&gt; 目录时，系统会创建一个名为 <b>netbeansprofiler</b> 的子目录。例如，在 Windows 操作系统中，如果已将教程 zip 文件解压缩到驱动器 <b>E:\</b> 的根目录中，则系统会创建 <b>E:\netbeansprofiler</b> 子目录。在 Solaris/Linux 操作系统中，如果已将教程 zip 文件解压缩到 <b>/home/<i>username</i></b> 目录中，则系统会创建 <b>/home/<i>username</i>/netbeansprofiler</b> 子目录。 </li></ul></ol><a name="top"></a><h3>教程练习</h3><ul><li><a href="http://www.netbeans.org/kb/articles/nb-profiler-tutor-8_zh_CN.html#Exercise_0">练习 0：安装并配置教程环境</a></li><li><a href="http://www.netbeans.org/kb/articles/nb-profiler-tutor-8_zh_CN.html#Exercise_1">练习 1：监视 Swing 应用程序中的线程状态</a></li><li><a href="http://www.netbeans.org/kb/articles/nb-profiler-tutor-8_zh_CN.html#Exercise_2">练习 2：确定某个方法使用的 CPU 时间（15 分钟）</a></li><li><a href="http://www.netbeans.org/kb/articles/nb-profiler-tutor-8_zh_CN.html#Exercise_3">练习 3：分析对象创建过程以查找内存泄漏</a><!-- <li><a href="#Exercise_4">Exercise 4: Monitoring an Applet</a></li> --></li></ul><h3>参考资源：</h3><ul><li><a href="http://www.netbeans.org/">NetBeans 主页</a></li><li><a href="http://profiler.netbeans.org/index_zh_CN.html">NetBeans Profiler 主页</a></li><li><a href="http://java.sun.com/developer/technicalArticles/Interviews/Dmitriev_qa.html">通过代码热交换进行更好的性能分析：JFluid 项目负责人 Misha Dmitriev 访谈录</a></li></ul><hr style="WIDTH: 100%; HEIGHT: 2px" /><br /><h2><a name="Exercise_0"></a>练习 0：安装并配置教程环境</h2><p>在开始学习教程之前，请先检查以下内容： 
</p><ol><li>启动 NetBeans IDE，并确认 IDE 已打开。通过选择“性能分析”&gt;“帮助”&gt;“关于性能分析器...”，验证安是否装了 NetBeans Profiler。<br /><ul><li>在 Windows 操作系统中，双击 NetBeans IDE 图标<br /></li><li>在 Solaris/Linux 操作系统中，打开终端窗口，然后键入 <b>&lt;NETBEANS_HOME&gt;/bin/netbeans</b></li></ul></li><li>仅限 NetBeans IDE v4.1：安装所需的修补程序。 
<ol><li>从“工具”菜单中选择“更新中心”，以访问 NetBeans 更新中心。 
</li><li>确保选中了“NetBeans 修补程序更新中心”，然后单击“下一步”按钮。建立连接后，将显示一个更新列表。 
</li><li>在“NetBeans 修补程序更新中心”条目下，选择“NetBeans Profiler（J2EE 项目 - Tomcat5 支持）”。该操作还将自动选择 "Tomcat 5 Server" 条目。 
</li><li>单击“下一步”按钮，并按照说明进行操作以便 IDE 可以安装这些修补程序。 </li></ol></li></ol><p><br /></p><!--- Exercise 1 Threads- --><div style="TEXT-ALIGN: left"><hr style="WIDTH: 100%; HEIGHT: 2px" /><br /><h2 class="main1"><a name="Exercise_1"></a>练习 1：监视 Swing 应用程序中的线程状态（15 分钟）<br /></h2><div style="MARGIN-LEFT: 40px"><h3>本练习的学习目的：</h3><p>在本练习中，您将学习如何使用 NetBeans Profiler 监视 J2SE 应用程序中的线程状态。这样，您就可以诊断样例应用程序中的性能问题。 </p><h3>背景信息：</h3><p><a href="http://java.sun.com/products/jfc/tsc/">Swing</a> 库为 J2SE 应用程序提供了图形用户界面组件。Swing 库会使用到多个线程，利用 NetBeans Profiler 这一功能强大的工具，您可以分析出每个线程所花费的处理时间，从而利用这些分析信息来解决性能问题。 </p><h3>执行步骤：</h3><p></p><ol><li>选择“文件”&gt;“打开项目”。找到 <tt>&lt;tutorial_root&gt;/netbeansprofiler/exercises</tt> 文件夹。选择 <tt>exercise1</tt> 文件夹，然后单击“打开项目文件夹”按钮。<br /></li><li>在“项目”窗口中，右键单击 <tt>exercise1</tt> 条目并选择“清理并生成项目”。然后，再次右键单击 <tt>exercise1</tt> 条目并选择“运行项目”。此时，将显示该程序的窗口，如下所示。 
<p><img alt="查看应用程序的窗口" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/notify.png" /><br /></p></li><li>将 "Seconds Before Notification" 设置为 30。<br /></li><li>单击 "Start!" 按钮。请注意，该程序无法正确地刷新屏幕。<br /></li><li>单击 "Exit" 按钮。请注意，该程序根本不会作出响应。<br /></li><li>将另一个窗口放在该窗口的某一部分上，以遮挡该窗口的视图。当移开另一个窗口时，您会注意到样例应用程序没有相应地刷新其窗口。如下面的示例所示。 
<p><img src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/notifyNoUpdate.png" /><br /></p></li><li>30 秒后，最终将显示一个消息框，如下所示。单击消息框上的 "OK" 按钮。 
<p><img src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/time.png" /><br /></p></li><li>应用程序窗口将再次开始响应。单击 "Exit" 按钮将其关闭。<br /></li><li>选择“性能分析”&gt;“分析主项目”。<br /></li><li>如果出现一个对话框，询问您是否允许修改项目生成脚本，请单击“确定”。如下面的示例所示。 
<p><img src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/modifyProject_zh_CN.png" /><br /></p></li><li>此时会显示“选择性能分析任务”对话框。单击占据较大区域的“监视应用程序”按钮。<br /></li><li>应选中“启用线程监视”复选框。<br /></li><li>单击“运行”按钮。如果显示一个对话框，指示您必须先收集 Profiler 的校准信息，请单击“确定”按钮。如下面的示例所示。 
<p><img src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/calibration_zh_CN.png" /></p><p>选择“性能分析”&gt;“高级命令”&gt;“运行性能分析器校准”。完成校准后，Profiler 会显示一个对话框，请单击“确定”按钮。如下面的示例所示。 
</p><p><img src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/calibrateInfo_zh_CN.png" /></p><p>要进行性能分析，请返回至上面的第 9 步。 </p></li><li>完成上述步骤后，将启动该应用程序，并且 IDE 会显示“性能分析器”控制面板，如下所示。 
<p><img src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/profilerConsole_zh_CN.png" /><br /></p></li><li>性能分析器将在其主窗口中显示线程状态，如下面的示例所示。 
<p><img src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/threads1_zh_CN.png" /><br />它使用颜色编码来显示线程状态。 
</p><ul><li>绿色：线程正在运行或准备运行。 
</li><li>紫色：线程正在调用 <tt>Thread.sleep()</tt>，处于休眠状态。 
</li><li>黄色：线程正在调用 <tt>Object.wait()</tt>，处于等待状态。 
</li><li>红色：线程在尝试访问同步的块或方法时受阻。 </li></ul><br /></li><li>找到样例 Swing 应用程序的窗口（NetBeans IDE 窗口可能在其上面）。单击样例应用程序中的 "Start!" 按钮，同时监视标记为 AWT-EventQueue-0 的线程所发生的变化。它将变为绿色并持续这种状态整整 30 秒钟，如以下样例所示。 
<p><img src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/threads2_zh_CN.png" /></p><p>此图形显示了应用程序没有响应的原因。标记为 AWT-EventQueue-0 的线程是 <a href="http://java.sun.com/products/jfc/tsc/">Swing</a> 用来处理窗口事件的<a href="http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html#EDT">事件分发线程 (Event Dispatch Thread, EDT)</a>。在正常运行的 Swing 应用程序中，EDT 的大部分时间处于等待状态而运行的时间却很少，因为它只有在分发事件时才会运行很短的一段时间。但是，如果应用程序中的事件处理程序未立即返回，则程序将停止响应，就像在此示例中一样。<br /></p></li><li>30 秒后，屏幕将显示应用程序的消息框。找到该消息框（NetBeans IDE 窗口可能在其上面）并单击 "OK" 按钮。然后，单击样例应用程序的 "Exit" 按钮，将其关闭。 <!-- If a synchronization
                    error occurs, don't worry, just click the <b>OK</b> button
                    on the error dialog; an example is shown below.<p>
                    <img src="../../images/articles/profiler8/unexpected.png"> --><br /></li><li>“项目”窗口与“性能分析器”控制面板共享同一个空间；单击“项目”标签将会显示“项目”窗口。<br /></li><li>在“项目”窗口中，双击 <tt>exercise1</tt> 条目以将其展开，然后展开“源包”和 <tt>profilingthreads</tt> 条目。右键单击 <tt>DisplayForm.java</tt> 条目并选择“打开”。<br /></li><li>在包含 <tt>DisplayForm.java</tt> 的编辑器窗口中，取消第 132 行至第 157 行的代码块注释。提示：如果未将编辑器配置为显示行号，请选择“视图”&gt;“显示行号”。 <br /></li><li>在包含 <tt>DisplayForm.java</tt> 的编辑器窗口中，取消（或注释掉）第 122 行到第 128 行的代码块注释。下图突出显示了取消注释的代码块。 
<p><img src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/delete_zh_CN.png" /><br /></p></li><li>选择“文件”&gt;“保存”。您刚才删除了未正确使用 EDT 的代码，并利用了更稳定可靠的解决方案来替代它。现在，应用程序可以及时地作出响应。<br /></li><li>选择“生成”&gt;“生成主项目”（或按 F11 键）。<br /></li><li>选择“性能分析”&gt;“分析主项目”。<br /></li><li>将显示“选择性能分析任务”对话框。单击占据较大区域的“监视应用程序”按钮。<br /></li><li>确保选中了“启用线程监视”。<br /></li><li>单击“运行”按钮。 
</li><li>在显示样例程序时，单击 "Start!" 按钮。请注意，此时的性能分析线程图已经发生了变化，如以下示例所示。 
<p><img src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/swingWorker_zh_CN.png" /></p><p>EDT 为黄色，应用程序创建的名为 "Our SwingWorker #1" 的线程为绿色。由于 EDT 不是用来执行耗时任务的，因此，按钮和其他程序控件仍保持响应的状态。 <br /></p></li><li>在样例程序中单击 "Exit"。<br /></li><li>右键单击 Profiler 图形中的 AWT-EventQueue-0 线程，然后选择“线程详细信息”。Profiler 会显示一个饼图，表明了每种状态所花的时间；如以下示例所示。 
<p><img src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/threadDetail_zh_CN.png" /></p><p>该图形可以帮助您判断程序在每个线程中所花费的时间是否恰当。上述示例是代码修复后的示例，因此，它显示了 EDT 在大部分时间中都处于等待状态的情形，这正好是该线程应具有的行为。<br /></p></li><li>在“项目”窗口中，右键单击 <tt>exercise1</tt> 条目，然后选择“关闭项目”。 </li></ol><h3>小结：</h3><p>在本练习中，您学习了如何使用 Profiler 来启动应用程序，以及如何解释 Profiler 的线程信息图形，以此来跟踪 Swing 应用程序中的性能问题。 </p><p><a href="http://www.netbeans.org/kb/articles/nb-profiler-tutor-8_zh_CN.html#top">返回页首</a></p></div><!--- Exercise 2 CPU time- --><hr style="WIDTH: 100%; HEIGHT: 2px" /><br /><h2 class="main1"><a name="Exercise_2"></a>练习 2：确定某个方法使用的 CPU 时间（15 分钟）<br /></h2><div style="MARGIN-LEFT: 40px"><h3>本练习的学习目的：</h3><p>在本练习中，您将学习如何使用 Profiler 来确定某个应用程序的方法所花费的时间。</p><h3>背景信息：</h3><p>CPU 的性能问题通常与应用程序的特定功能有关。例如，在报告系统中，某个报告的运行速度可能比其他报告慢。只分析应用程序中出现性能问题的部分，可以大大减少性能分析器产生的开销。在本练习中，您将使用 NetBeans Profiler 来检查 Web 应用程序中 CPU 的使用情况。在练习 3 中，我们仍然使用该样例 Web 应用程序来说明如何通过 Profiler 查找内存泄漏。</p><h3>执行步骤：</h3><ol><li>选择“文件”&gt;“打开项目”。找到 <tt>&lt;tutorial_root&gt;/netbeansprofiler/exercises</tt> 文件夹。选择 <tt>exercise2</tt> 文件夹，并确保选中“作为主项目打开”。单击“打开项目文件夹”按钮。<br /></li><li>在“项目”窗口中，单击 <tt>exercise2</tt> 条目，然后从菜单中选择“生成”&gt;“清理并生成主项目”。 
</li><li>从菜单中选择“性能分析”&gt;“分析主项目”。如果出现一个对话框，询问您是否允许修改项目生成脚本，请单击“确定”。 
</li><li>将显示“选择性能分析任务”对话框。 
</li><li>单击“分析性能”按钮。<br /></li><li>选择“部分应用程序”单选按钮。然后，单击位于“部分应用程序”单选按钮旁边的“选择”按钮。此时将显示“指定根方法”窗口。<br /><p><em>注意：下面的三个步骤仅适用于 Milestone 8。</em></p></li><li>在“指定根方法”窗口中，单击“从项目添加...”按钮以添加要分析的根方法。将会显示“选择方法”窗口。<br /></li><li>在“选择方法”窗口中，单击“选择”按钮。Profiler 将显示“选择类”窗口。<br /></li><li>在“类名”文本字段中输入 <code>Per</code>。等待 IDE 为您显示适用的类列表。选择 <tt>Performance</tt> 类。单击“打开”按钮以打开其方法列表。 
<p><em>注意：下面的两个步骤只适用于 Profiler v5.0。</em></p></li><li>在“指定根方法”窗口中，单击“从项目添加...”按钮以添加要分析的根方法。将会显示“选择方法”窗口。<br /></li><li>在“类名”文本字段中，键入 <tt>demo.Performance</tt>，然后按 Enter 键。 
<p><img alt="查看“选择方法”对话框" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/select_methods_zh_CN.png" /><br /></p></li><li>在根方法列表中单击 <tt><b>processRequest</b></tt> 方法以将其选中，然后单击“确定”按钮。您刚才已将 <tt>demo.Performance.processRequest</tt> 选中为性能分析的根方法。这意味着，性能分析器将分析 <tt>demo.Performance.processRequest</tt> 方法和它调用的所有方法，以及这些方法又调用的所有方法，依此类推。性能分析器将从 <tt>demo.Performance.processRequest</tt> 开始，通过分析方法调用图形来确定哪些方法需要分析。它将只分析那些需要分析的方法，应用程序的其余部分将在没有任何性能分析开销的情况下继续以最快的速度运行。<br /></li><li>在“指定根方法”窗口中单击“确定”按钮。<br /></li><li>在“分析性能”窗口中，从过滤器列表中选择“快速过滤器”，然后单击位于“快速过滤器”条目旁边的 "..." 按钮以指定<b>不</b>进行分析的方法。将显示“设置快速过滤器”窗口。验证是否已选中了“排除”单选按钮。然后，在“过滤器值”文本字段中输入 <tt>org.apache</tt> 并单击“确定”按钮。这样，性能分析器将不分析所有 org.apache 包（及其子包）中的方法，即使这些方法被选定的根方法调用也是如此。这会减少性能分析的开销，并过滤掉无关的信息。 
<p><img alt="“设置快速过滤器”对话框" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/filter_zh_CN.png" /><br /></p></li><li>在“选择性能分析任务”窗口中，单击“运行”按钮。如果出现一个对话框，要求您提供校准信息，请单击“确定”按钮；在性能分析器显示的对话框说明校准已完成后，请单击该对话框的“确定”按钮。 
</li><li>IDE 将启动 Tomcat，并在 Web 浏览器窗口中显示 Web 应用程序的 index.jsp 页。同时，将在后台运行性能分析器。注意：缺省情况下，将在成为焦点的浏览器窗口中显示 index.jsp 页；您可能需要打开另一个浏览器窗口，以便在运行 Web 应用程序时可以阅读这些说明。<br /></li><li>因为已选择了 <tt>demo.Performance.processRequest</tt> 作为根方法，所以，您需要使用导致该根方法运行的 Web 应用程序部分：在 Web 浏览器中，单击“性能问题”以转至“性能”演示页。在“性能”演示页上的输入文本字段中输入 123456。请不要选中“已优化”选项。单击“提交查询”按钮，计算小于或等于 123456 的最大素数。<br /></li><li>需要几秒钟的时间才能出现响应，这是因为计算最大素数的算法存在一些性能问题，同时，在监视 <tt>processRequest</tt> 方法的性能时，性能分析器也会产生一些开销。 
</li><li>当浏览器中显示 "123449" 结果后，请单击 <img alt="“获取结果”按钮" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/getResults.png" /> 按钮，或者选择“性能分析”&gt;“生成收集结果的快照”。单击位于 CPU 使用情况快照底部的“组合”标签。性能分析器将显示最新的性能结果，如下所示。 
<p><!-- TODO: Potential problem: how do we deal with multiple threads in the results?
                    The processRequest() method is invoked twice.  If it gets invoked on
                    two different threads then how do we know for certain that the thread
                    we want expanded will be expanded? --><img alt="查看性能结果。" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/performanceResults1_zh_CN.png" /></p><p>顶部窗口显示了从根方法开始的完整方法调用图形。底部窗口是重点描述的部分；它显示了应用程序中的热点，即执行时间最长的那些方法。 </p></li><li>要查看并解释这些结果，请注意 <tt>processRequest</tt> 方法总共运行的时间为 4308 毫秒 (ms)。然而您会发现，运行 <tt>processRequest</tt> 方法本身的指令只花费了很少的时间，<tt>processRequest</tt> 的“自用时间”仅为 10.1 毫秒。绝大部分时间花在了 <tt>processRequest</tt> 调用的其他方法上。底部窗口中显示的热点是按“自用时间”进行排序的。通过查看该列表，您可以看到 <tt>calculate</tt> 方法占用了 97.8% 的执行时间。考虑到为 <tt>calculate</tt> 方法分配的工作量，这就不足为奇了。 
</li><li>为了帮助您确定如何优化应用程序，NetBeans Profiler 可以识别代码中无法预料的瓶颈，或者识别妨碍应用程序随意缩放的瓶颈。单击热点列表中的 <tt>calculate</tt> 条目以了解时间究竟花在什么地方，这会更新调用图形窗口以显示 <tt>calculate</tt>。因为 <tt>calculate</tt> 方法不调用任何其他方法，所以请右键单击 <tt>calculate</tt> 条目，然后选择“转至源代码”以便检查源代码。您会发现它使用了效率很低的算法，所以应该重新设计这种算法。 
</li><li>选择“性能分析”&gt;“重置收集的结果”以清除性能分析器的缓冲区。要将 <tt>calculate</tt> 的运行时与优化的算法 <tt>calculate2</tt> 作比较，请在 Web 浏览器中选中“已优化”选项，然后单击“提交查询”。等待显示结果，然后重新选择“性能分析”&gt;“生成收集结果的快照”。请注意，<tt>processRequest</tt> 方法只运行了 107 毫秒，而 <tt>calculate2</tt> 方法所花的时间还不到执行时间的 10%！ 
<p><img alt="查看性能结果。" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/performanceResults2_zh_CN.png" /></p><br /></li><li>注意：我们将继续在本练习的基础上进行下面的练习，因此，请不要关闭任何窗口。<br /></li></ol><h3>小结：</h3><p>在本练习中，您学习了如何使用性能分析器执行方法性能分析。</p><p><a href="http://www.netbeans.org/kb/articles/nb-profiler-tutor-8_zh_CN.html#top">返回页首</a></p></div><!---exercise 3  memory leak- --><hr style="WIDTH: 100%; HEIGHT: 2px" /><br /><h2 class="main1"><a name="Exercise_3"></a>练习 3：分析对象创建过程以查找内存泄漏（20 分钟）<br /></h2><div style="MARGIN-LEFT: 40px"><h3>本练习的学习目的：</h3><p>作为<a href="http://www.netbeans.org/kb/articles/nb-profiler-tutor-8_zh_CN.html#Exercise_2">练习 2</a> 的后续练习，我们将在本练习中学习如何解释某些性能分析器的图形以监视应用程序创建对象的过程。下面将显示一个内存泄漏示例。 </p><h3>执行步骤：</h3><ol><li>本练习是在<a href="http://www.netbeans.org/kb/articles/nb-profiler-tutor-8_zh_CN.html#Exercise_2">练习 2</a> 的基础上进行的，因此，请务必遵循<a href="http://www.netbeans.org/kb/articles/nb-profiler-tutor-8_zh_CN.html#Exercise_2">练习 2</a> 中的步骤。<br /></li><li>从菜单中选择“性能分析”&gt;“分析主项目”。如果出现一个对话框，询问您是否要停止当前的性能分析器进程以启动新进程（如下所示），请单击“是”按钮继续执行。 
<p><img alt="“停止并重新启动性能分析器”对话框" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/restart_profiler_zh_CN.png" /></p><p>将显示“选择性能分析任务”对话框。 </p></li><li>在“选择性能分析任务”对话框中，单击占据较大区域的“监视应用程序”按钮。 
</li><li>单击“运行”按钮。IDE 将会在左侧显示“性能分析器”控制台。单击 <img alt="查看“遥测概览”按钮" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/telemetryOverview.png" /> 按钮，或者选择“性能分析”&gt;“视图”&gt;“遥测概览”。NetBeans Profiler 将在底部的输出窗口中显示三个图形，如下所示。 
<p><a href="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/monitorGraphs_zh_CN.png"><img alt="查看监视器图形" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/monitorGraphs_zh_CN.png" width="600" border="0" /></a></p><p>在左侧的图形中，红色的阴影部分表示分配的 JVM 堆大小。紫色的覆盖部分表示实际使用的堆空间大小。在上面的示例中，上次更新所分配的堆大小已超过了 20 MB。其中，实际用来保存 Java 对象的堆大小略大于 10 MB。</p><p>右侧图形显示了 JVM 中的活动线程数。</p><p>中间的图形显示了两种重要的堆统计信息。 
</p><ul><li>蓝线是 JVM 执行垃圾回收的时间占执行时间的百分比，它是以图形右侧上的 Y 轴为参照绘制的。JVM 执行垃圾回收所花的时间不能用来运行应用程序。因此，如果蓝线占据较大的百分比，则需要考虑调整 JVM，方法是：配置更大的堆大小（请参阅 -Xmx 参数<a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/java.html#nonstandard">文档</a>），或者转换到不同的垃圾回收<a href="http://java.sun.com/docs/hotspot/gc1.4.2/">算法</a>中。<br /></li><li>红线表示存活的生成数，它是以图形左侧的 Y 轴为参照进行绘制的。存活生成数是指 JVM 堆上所有 Java 对象不同生存期的数量，其中“生存期”被定义为对象存活时的垃圾回收次数。如果存活生成数的值较小，则表明堆上的大部分对象的存活时间基本相同。但是，如果存活生成数的值随着时间的变化而增长到一个很高的比率，则表明应用程序正在分配新的对象，同时保持对已分配的多个旧对象的引用。如果实际上不再需要这些旧对象，则应用程序正在浪费（或“泄漏”）内存。 </li></ul><p></p></li><li>性能分析器可以对 CPU 性能或内存使用情况进行详细的分析，但不能同时进行这两种分析。要了解有关在 JVM 堆上分配对象以及执行对象的垃圾回收的详细信息，请修改性能分析器的设置。单击 <img alt="查看“修改性能分析”按钮" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/modifyProfilingButton.png" /> 按钮，或者选择“性能分析”&gt;“修改性能分析”。<br /></li><li>单击“分析内存使用情况”按钮。<br /></li><li>选择“记录对象创建和垃圾回收”单选按钮。<br /></li><li>选中“记录分配的栈跟踪”复选框。<br /></li><li>单击“确定”按钮。<br /></li><li>现在，您已经选择了分析内存使用情况，您需要运行应用程序以确定它是否有效地使用了内存。单击“内存泄漏”以转至 MemoryLeak 演示页。 
</li><li>在 MemoryLeak 演示页上，单击“开始泄漏”。<br /></li><li>请注意存活生成数图形中的峰值，如以下示例所示。这表明可能出现了内存泄漏。 
<p><img alt="存活生成数图形所示的峰值。" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/genSpike_zh_CN.png" /><br /></p></li><li>选择“性能分析”&gt;“视图”&gt;“实时结果”。Profiler 将显示 JVM 堆中分配的对象的动态视图。缺省情况下，它将按每个类的所有实例使用的字节数进行排序。由于怀疑可能出现了内存泄漏，因此，请单击“生成数”列，按每个类的不同对象生存期数量对显示结果进行排序。下面显示了得到的显示结果示例。 
<p><a href="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/initGen_zh_CN.png"><img alt="先前的生成数图形。" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/initGen_zh_CN.png" width="600" border="0" /></a><br />这些列提供了对象分配和内存使用情况信息。 
</p><ul><li>“分配的对象”是性能分析器正在监视的对象数。在本示例中，共监视了 38 个 <tt>float[]</tt> 实例。缺省情况下，该数字约为应用程序实际分配的对象数的 10%。通过只监视已创建对象的一部分，性能分析器可以显著地减少它在 JVM 中的开销，这样，应用程序就几乎可以按最快的速度运行了。<br /></li><li>“活动对象”是仍在 JVM 堆中并因此占用内存的已分配对象数。<br /></li><li>两个“活动字节”列显示了活动对象所占用的堆内存量。一个列显示图形，另一个列显示文本。<br /></li><li>“平均生存期”值是使用活动对象计算的。每个对象的生存期是它存活时的垃圾回收次数。生存期总和除以活动对象数得到的结果就是平均生存期。<br /></li><li>“生成数”值是使用活动对象计算的。与平均生存期相同，对象生存期是它存活时的垃圾回收次数。“生成数”值是活动对象的不同生存期数量。<br /></li></ul><br /></li><li>随着程序继续运行，性能分析器将更新显示结果。请留意 <tt>float[]</tt> 和 <tt>double[]</tt> 条目。请注意其生成数值是如何持续增加的。结果是，<tt>float[]</tt> 和 <tt>double[]</tt> 在列表中持续上移。最终，它们会显示在列表的顶部，紧靠 <tt>java.util.HashMap$Entry</tt>（其生代数值也在不断增加）下面。随着应用程序继续运行，<tt>java.util.HashMap$Entry</tt>、<tt>float[]</tt> 和 <tt>double[]</tt> 生成数值持续增加，但任何其他类没有增加。如下面的示例所示。 
<p><a href="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/eventualGen_zh_CN.png"><img alt="后期的生成数图形。" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/eventualGen_zh_CN.png" width="600" border="0" /></a><br /></p></li><li>要了解导致生成数值持续增加的原因，请选择“性能分析”&gt;“生成收集结果的快照”。按生成数对显示结果进行排序。右键单击 <tt>double[]</tt> 条目，然后选择“显示分配栈跟踪”。性能分析器将显示所有分配了一个或多个 <tt>double[]</tt> 对象的方法。如下面的示例所示。 
<p><a href="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/double_zh_CN.png"><img alt="double[] 栈跟踪。" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/double_zh_CN.png" width="600" border="0" /></a><br />请注意，在分配了 <tt>double[]</tt> 对象的方法中，只有一个方法创建了具有较大生成数值的 <tt>double[]</tt> 对象。该方法是 <tt>run()</tt>，它位于具有相应名称 demo.memoryleak.LeakThread 的类中。 </p></li><li>右键单击 <tt>run()</tt> 方法条目，然后选择“转至源代码...”。性能分析器将显示源代码，如下所示。<a href="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/leakthread_zh_CN.PNG"><img alt="引起泄漏的代码" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/leakthread_zh_CN.PNG" width="600" border="0" /></a><br />请注意，正在分配 <tt>double[]</tt> 和 <tt>float[]</tt> 对象，并随后将其放在 <tt>HashMap</tt> 中。但一直并未删除它们，这意味着，<tt>HashMap</tt> 保留的引用将会妨碍 JVM 对这些对象进行垃圾回收。这是非常典型的 Java 内存泄漏：将对象放在 <tt>Map</tt> 中，然后就忘记处理它们了。由于本示例中使用的 <tt>Map</tt> 就是 <tt>HashMap</tt>，因此，关联的 <tt>java.util.HashMap$Entry</tt> 对象也出现了泄漏。 
<p></p></li><li>选择“性能分析”&gt;“停止”来结束性能分析会话，或者单击 <img alt="“停止”按钮" src="mhtml:file://C:\Documents and Settings\lideqiang\桌面\NetBeans IDE 4_1-5_0 Profiler 教程.mht!http://www.netbeans.org/images/articles/profiler8/StopButton.jpg" /> 按钮。 <br /><!--  Not necessary with M8...
                    <li>When prompted to end the application, click the <b>Yes</b> button.<br /></li>
                    --></li><li>在“项目”窗口中，选择 <tt>exercise2</tt> 条目，然后从菜单中选择“文件”&gt;“关闭项目”。 </li></ol><h3>小结：</h3><p>在本练习中，您学习了如何使用性能分析器来监视应用程序创建对象的过程。您还看到了性能分析器在应用程序出现内存泄漏时所提供的各种类型的分析指数。</p></div></div></font>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/11875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2006-08-31 08:42 <a href="http://www.cppblog.com/Backkom-Li/archive/2006/08/31/11875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>代码静态分析工具PC-LINT安装配置【转】</title><link>http://www.cppblog.com/Backkom-Li/archive/2006/08/17/11368.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Thu, 17 Aug 2006 10:56:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2006/08/17/11368.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/11368.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2006/08/17/11368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/11368.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/11368.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">         PC-Lint是C/C++软件代码静态分析工具，你可以把它看作是一种更加严格的编译器。它不仅可以检查出一般的语法错误，还可以检查出那些虽然符合语法要求但不易发现的潜在错误。<br /> <br />C语言的灵活性带来了代码效率的提升，但相应带来了代码编写的随意性，另外C编译器不进行强制类型检查，也带来了代码编写的隐患。PCLint识别并报告C语言中的编程陷阱和格式缺陷的发生。它进行程序的全局分析，能识别没有被适当检验的数组下标，报告未被初始化的变量，警告使用空指针，冗余的代码，等等。软件除错是软件项目开发成本和延误的主要因素。PClint能够帮你在程序动态测试之前发现编码错误。这样消除错误的成本更低。<br /> 使用PC-Lint在代码走读和单元测试之前进行检查，可以提前发现程序隐藏错误，提高代码质量，节省测试时间。并提供编码规则检查，规范软件人员的编码行为。<br />由于PC-LINT对于一般程序员来说可能比较陌生，有好多人安装了也不知道怎样配置和使用。<br /> <br /> <br />下面我就根据自己的安装和配置心得对PC-Lint的安装、配置及使用进行下详细说明.本人主要介绍了将PC-Lint集成到VC++6.0和SourceInsight的方法和步骤。 </font>
		</p>
		<p>
				<font size="2">(一)Windows下C/C++开发工具中，VC6使用较为普遍，因此这里先讲下VC6.0环境中集成pclint的步骤.<br />首先, <br />当然要下载软件，正版软件要200多$呢，买不起！所以只好网上找免费的拉。从</font>
				<a href="http://www.61ic.com/down/othe/pclint.rar">
						<font size="2">http://www.61ic.com/down/othe/pclint.rar</font>
				</a>
				<font size="2">处可以下载到一个8.0版本的pclint.<br />1.将pclint.rar解压至c:\, 这样lint文件就位与c:\pclint(安装目录)下了。<br />2.将c:\pclint\lnt 下的3个文件lib-w32.lnt，env-vc6.lnt，co-msc60.lnt拷贝至c:\pclint下， <br />再在安装目录下创建std.lnt和options.lnt两个文件，其中std.lnt的内容如下<br />// contents of std.lnt<br />c:\pclint\co-msc60.lnt<br />c:\pclint\lib-w32.lnt<br />c:\pclint\options.lnt  -si4 -sp4<br />-i"D:\Program Files;D:\Program Files\Microsoft Visual Studio\VC98\Include"<br />//end<br />其中-i后面的路径名为VC的安装路径和VC Include 文件路径，根据自己的修改便可。<br />options.lnt 内容可为空，为定制内容,以后需要时再添加。<br />准备工作做完了，下一步就是要将pclint集成到VC6中去，先配置lint使之能对单个C或C++文件进行检查。<br />1.打开VC6，tools---&gt;customize--&gt;tools 新建一个名为pclint的项，在下面填入<br />command:  C:\pclint\lint-nt.exe<br />arguments:  -u c:\pclint\std.lnt  c:\pclint\env-vc6.lnt  "$(FilePath)"<br />Use Output Window  打上勾<br />close 完成。 这个在你VC窗口tools菜单下应该多了一个pclint选项，可以用它来运行lint程序，对你的c/c++代码进行静态检查了。<br />现在就可以用个小程序测试一下pclint了</font>
		</p>
		<p>
				<font size="2">//test1.cpp#include &lt;string.h&gt;<br />class X<br />{<br /> int *p;<br />public:<br /> X()<br /> { p = new int[20]; }<br /> void init()<br /> { memset( p, 20, 'a'  ); }<br /> ~X()<br /> { delete p; }<br />};<br />编译这个文件，看下你的编译器给你多少警告，再运行下lint， 可以自己对比一下。<br />我的机器上，VC产生0 errors 0 warnings, 而lint程序产生了如下8条警告信息,有些还是很有用处的提示，这里就不一一分析了.<br />test.cpp(12): error 783: (Info -- Line does not end with new-line)<br />test.cpp(7): error 1732: (Info -- new in constructor for class 'X' which has no <br />assignment operator)<br />test.cpp(7): error 1733: (Info -- new in constructor for class 'X' which has no <br />copy constructor)<br />    { memset( p, 20, 'a'  ); }<br />test.cpp(9): error 669: (Warning -- Possible data overrun for function <br />'memset(void *, int, unsigned int)', argument 3 (size=97) exceeds argument 1 <br />(size=80) [Reference: test.cpp: lines 7, 9])<br />test.cpp(7): error 831: (Info -- Reference cited in prior message)<br />test.cpp(9): error 831: (Info -- Reference cited in prior message)<br />    { delete p; }<br />test.cpp(11): error 424: (Warning -- Inappropriate deallocation (delete) for <br />'new[]' data)</font>
		</p>
		<p>
				<font size="2"> --- Wrap-up for Module: test.cpp<br />test.cpp(2): error 753: (Info -- local class 'X' (line 2, file test.cpp) not <br />referenced)<br />Tool returned code: 8</font>
		</p>
		<p>
				<font size="2">2.通常一个VC项目中包含多个C或C++文件，有时需要同时对这一系列的文件进行lint检查，我们可以通过配置一个pclint_project来达到目的。<br />和前面第一步中的方法基本一样，不过这里我们需要用到unix中的find等命令来查找当前目录下的C和C++文件，然后再将它们送给lint程序处理，所以得先从</font>
				<a href="http://www.weihenstephan.de/~syring/win32/UnxUtils.zip">
						<font size="2">http://www.weihenstephan.de/~syring/win32/UnxUtils.zip</font>
				</a>
				<font size="2">下载UnxUtils.zip.<br />接着按下列步骤进行：<br />(i)解压UnxUtils.zip至c:\unix下, 可以看到C:\unix\usr\local\wbin有很多unix下的命令,等下会用到<br />(ii)打开VC6，tools---&gt;customize--&gt;tools <br />新建一个名为pclint_project的项，只不过下面的commands和arguments内容不同。<br />commands: C:\unix\usr\local\wbin\find.exe<br />arguments: $(FileDir) -name *.c  -o -name *.cpp | C:\unix\usr\local\wbin\xargs <br />lint-nt            -i"c:\unix\usr\local"  -u c:\pclint\std.lnt  <br />c:\pclint\env-vc6.lnt <br />(iii)Use Output Window打上勾，close退出。好了，这时VC <br />tools菜单下应该又多了一个pclint_project项了，你以后可以用它来对一个VC项目运行lint检查程序了.</font>
		</p>
		<p>
				<font size="2">(二)SourceInsight中集成pclint程序的方法.<br />Windows平台下也有好多人都喜欢用SourceInsight编辑C/C++程序，如果将pclint集成到SourceInsight中，那就相当于给SourceInsight增加了一个C/C++编译器,而且它的检查更严格，能发现一些编译器发现不了的问题，可以大大减少程序中潜伏的BUG。这样的话，相信更多人会喜欢SourceInsight这个工具了。<br />下面简要地介绍下pclint集成到SourceInsight中的方法 <br />有了上面VC中集成pclint的经验, 下面的事情就应该比较轻松了，<br />(a)打开你的SourceInsight, 选择Options--&gt;Custom Commands--&gt;Add, 输入pclint(当然名字可以随便).<br />(b) Run中输入: c:\pclint\lint-nt  -u  c:\pclint\std.lnt  c:\pclint\env-vc6.lnt %f<br />(c)Dir留空，将Iconic Window, Capture Output, Parse Links in OutPut, File,then Line <br />四项前打上勾。<br />(d)然后点右侧 Menu---&gt;Menu--&gt;View--&gt;&lt;end of menu&gt;, 右侧Insert, OK.<br />(e)此时在SourceInsight中的View菜单下多了个pclint选项，可以用它来对单个C/C++文件进行静态检查。</font>
		</p>
		<p>
				<font size="2">用类似的方法可以配置对一个SourceInsight工程文件的lint检查。<br />(a)打开你的SourceInsight, 选择Options--&gt;Custom Commands--&gt;Add, <br />输入pclint_project(当然名字可以随便).<br />(b) Run中输入: C:\unix\usr\local\wbin\find.exe %d -name *.c  -o -name *.cpp  | <br />C:\unix\usr\local\wbin\xargs lint-nt <br />-i"C:\unix\usr\local" -u c:\pclint\std.lnt  c:\pclint\env-vc6.lnt<br />(c)Dir留空，将Iconic Window, Capture Output, Parse Links in OutPut, File,then Line <br />四项前打上勾。<br />(d)然后点右侧 Menu---&gt;Menu--&gt;View--&gt;&lt;end of menu&gt;, 右侧Insert, OK.<br />(e)此时在SourceInsight中的View菜单下多了个pclint_project选项，可以用它来一个工程中的C/C++文件进行静态检查。</font>
		</p>
		<p>
				<font size="2">本文主要对pclint集成到VC及SourceInsight环境中的方法根据本人安装和使用心得做了较详细介绍，希望对以前没使用过pclint的朋友们能有所帮助，不足之处还请多指正！<br /></font>
		</p>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/11368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2006-08-17 18:56 <a href="http://www.cppblog.com/Backkom-Li/archive/2006/08/17/11368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件操作</title><link>http://www.cppblog.com/Backkom-Li/archive/2006/08/10/11076.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Thu, 10 Aug 2006 00:55:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2006/08/10/11076.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/11076.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2006/08/10/11076.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/11076.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/11076.html</trackback:ping><description><![CDATA[
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">#include <br /></span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />main() <br /></span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_18_227_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_227_Open_Text.style.display='none'; Codehighlighter1_18_227_Closed_Image.style.display='inline'; Codehighlighter1_18_227_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_18_227_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_18_227_Closed_Text.style.display='none'; Codehighlighter1_18_227_Open_Image.style.display='inline'; Codehighlighter1_18_227_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_18_227_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_18_227_Open_Text">
						<span style="COLOR: #000000">{ <br /></span>
						<span style="COLOR: #008080"> 4</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />FILE </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">fp; <br /></span>
						<span style="COLOR: #008080"> 5</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">char</span>
						<span style="COLOR: #000000"> ch; <br /></span>
						<span style="COLOR: #008080"> 6</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">((fp</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">fopen(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">c1.txt</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">,</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">rt</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">))</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">NULL) <br /></span>
						<span style="COLOR: #008080"> 7</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_79_145_Open_Image" onclick="this.style.display='none'; Codehighlighter1_79_145_Open_Text.style.display='none'; Codehighlighter1_79_145_Closed_Image.style.display='inline'; Codehighlighter1_79_145_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_79_145_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_79_145_Closed_Text.style.display='none'; Codehighlighter1_79_145_Open_Image.style.display='inline'; Codehighlighter1_79_145_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span id="Codehighlighter1_79_145_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_79_145_Open_Text">
								<span style="COLOR: #000000">{ <br /></span>
								<span style="COLOR: #008080"> 8</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />printf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">\nCannot open file strike any key exit!</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">); <br /></span>
								<span style="COLOR: #008080"> 9</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />exit(</span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">); <br /></span>
								<span style="COLOR: #008080">10</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000"> <br /></span>
						<span style="COLOR: #008080">11</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />ch</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">fgetc(fp); <br /></span>
						<span style="COLOR: #008080">12</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">while</span>
						<span style="COLOR: #000000">(ch</span>
						<span style="COLOR: #000000">!=</span>
						<span style="COLOR: #000000">EOF) <br /></span>
						<span style="COLOR: #008080">13</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_179_211_Open_Image" onclick="this.style.display='none'; Codehighlighter1_179_211_Open_Text.style.display='none'; Codehighlighter1_179_211_Closed_Image.style.display='inline'; Codehighlighter1_179_211_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_179_211_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_179_211_Closed_Text.style.display='none'; Codehighlighter1_179_211_Open_Image.style.display='inline'; Codehighlighter1_179_211_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span id="Codehighlighter1_179_211_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_179_211_Open_Text">
								<span style="COLOR: #000000">{ <br /></span>
								<span style="COLOR: #008080">14</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />putchar(ch); <br /></span>
								<span style="COLOR: #008080">15</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />ch</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">fgetc(fp); <br /></span>
								<span style="COLOR: #008080">16</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000"> <br /></span>
						<span style="COLOR: #008080">17</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />fclose(fp); <br /></span>
						<span style="COLOR: #008080">18</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">                                                   </span>
		</div>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">#include <br /></span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />main(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> argc,</span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">argv[]) <br /></span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_39_487_Open_Image" onclick="this.style.display='none'; Codehighlighter1_39_487_Open_Text.style.display='none'; Codehighlighter1_39_487_Closed_Image.style.display='inline'; Codehighlighter1_39_487_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_39_487_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_39_487_Closed_Text.style.display='none'; Codehighlighter1_39_487_Open_Image.style.display='inline'; Codehighlighter1_39_487_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_39_487_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_39_487_Open_Text">
						<span style="COLOR: #000000">{ <br /></span>
						<span style="COLOR: #008080"> 4</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />FILE </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">fp1,</span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000">fp2; <br /></span>
						<span style="COLOR: #008080"> 5</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">char</span>
						<span style="COLOR: #000000"> ch; <br /></span>
						<span style="COLOR: #008080"> 6</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(argc</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">) <br /></span>
						<span style="COLOR: #008080"> 7</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_82_179_Open_Image" onclick="this.style.display='none'; Codehighlighter1_82_179_Open_Text.style.display='none'; Codehighlighter1_82_179_Closed_Image.style.display='inline'; Codehighlighter1_82_179_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_82_179_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_82_179_Closed_Text.style.display='none'; Codehighlighter1_82_179_Open_Image.style.display='inline'; Codehighlighter1_82_179_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span id="Codehighlighter1_82_179_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_82_179_Open_Text">
								<span style="COLOR: #000000">{ <br /></span>
								<span style="COLOR: #008080"> 8</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />printf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">have not enter file name strike any key exit</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">); <br /></span>
								<span style="COLOR: #008080"> 9</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />getch();       </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">用于等待输入文件名</span>
								<span style="COLOR: #008000">
										<br />
								</span>
								<span style="COLOR: #008080">10</span>
								<span style="COLOR: #008000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">exit(</span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">); <br /></span>
								<span style="COLOR: #008080">11</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000"> <br /></span>
						<span style="COLOR: #008080">12</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">((fp1</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">fopen(argv[</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">],</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">rt</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">))</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">NULL) <br /></span>
						<span style="COLOR: #008080">13</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_219_280_Open_Image" onclick="this.style.display='none'; Codehighlighter1_219_280_Open_Text.style.display='none'; Codehighlighter1_219_280_Closed_Image.style.display='inline'; Codehighlighter1_219_280_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_219_280_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_219_280_Closed_Text.style.display='none'; Codehighlighter1_219_280_Open_Image.style.display='inline'; Codehighlighter1_219_280_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span id="Codehighlighter1_219_280_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_219_280_Open_Text">
								<span style="COLOR: #000000">{ <br /></span>
								<span style="COLOR: #008080">14</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />printf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">Cannot open %s\n</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">,argv[</span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">]); <br /></span>
								<span style="COLOR: #008080">15</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />getch(); <br /></span>
								<span style="COLOR: #008080">16</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />exit(</span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">); <br /></span>
								<span style="COLOR: #008080">17</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">18</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(argc</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">) fp2</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">stdout; <br /></span>
						<span style="COLOR: #008080">19</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">else</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">((fp2</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">fopen(argv[</span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">],</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">wt+</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">))</span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000">NULL) <br /></span>
						<span style="COLOR: #008080">20</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_350_411_Open_Image" onclick="this.style.display='none'; Codehighlighter1_350_411_Open_Text.style.display='none'; Codehighlighter1_350_411_Closed_Image.style.display='inline'; Codehighlighter1_350_411_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_350_411_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_350_411_Closed_Text.style.display='none'; Codehighlighter1_350_411_Open_Image.style.display='inline'; Codehighlighter1_350_411_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
						</span>
						<span id="Codehighlighter1_350_411_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_350_411_Open_Text">
								<span style="COLOR: #000000">{ <br /></span>
								<span style="COLOR: #008080">21</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />printf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">Cannot open %s\n</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">,argv[</span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">]); <br /></span>
								<span style="COLOR: #008080">22</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />getch(); <br /></span>
								<span style="COLOR: #008080">23</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />exit(</span>
								<span style="COLOR: #000000">1</span>
								<span style="COLOR: #000000">); <br /></span>
								<span style="COLOR: #008080">24</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000"> <br /></span>
						<span style="COLOR: #008080">25</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">while</span>
						<span style="COLOR: #000000">((ch</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">fgetc(fp1))</span>
						<span style="COLOR: #000000">!=</span>
						<span style="COLOR: #000000">EOF) <br /></span>
						<span style="COLOR: #008080">26</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />fputc(ch,fp2); <br /></span>
						<span style="COLOR: #008080">27</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />fclose(fp1); <br /></span>
						<span style="COLOR: #008080">28</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />fclose(fp2); <br /></span>
						<span style="COLOR: #008080">29</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000"> <br /></span>
				<span style="COLOR: #008080">30</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<div class="O" v:shape="_x0000_s1026">
				<span style="FONT-SIZE: 156%">
						<div style="mso-line-spacing: '90 20 0'; mso-margin-left-alt: 216; mso-char-wrap: 1; mso-kinsoku-overflow: 1">
								<span style="LEFT: -7.19%; POSITION: absolute; mso-special-format: bullet">•</span>
								<br />
								<font size="2">•使用文件的方式共有12种，下面给出了它们的符号和意义。 <br />•w    代表写操作 <br />•r     代表阅读 <br />•b    代表二进制数 <br />•a    代表添加操作，文件不纯在则建立 <br />•+    代表扩展 <br /> <br />“rt”  读打开一个文本文件，只允许读数据 </font>
						</div>
						<div style="mso-line-spacing: '90 20 0'; mso-margin-left-alt: 216; mso-char-wrap: 1; mso-kinsoku-overflow: 1">
								<font size="2">“wt” 只写打开或建立一个文本文件，只允许写数据 </font>
						</div>
						<div style="mso-line-spacing: '90 20 0'; mso-margin-left-alt: 216; mso-char-wrap: 1; mso-kinsoku-overflow: 1">
								<font size="2">“at” 追加打开一个文本文件，并在文件末尾写数据 </font>
						</div>
						<div style="mso-line-spacing: '90 20 0'; mso-margin-left-alt: 216; mso-char-wrap: 1; mso-kinsoku-overflow: 1">
								<font size="2">“rb” 只读打开一个二进制文件，只允许读数据 </font>
						</div>
						<div style="mso-line-spacing: '90 20 0'; mso-margin-left-alt: 216; mso-char-wrap: 1; mso-kinsoku-overflow: 1">
								<font size="2">“wb” 只写打开或建立一个二进制文件，只允许写数据 <br />“ab”追加打开一个二进制文件，并在文件末尾写数据 <br />“rt+” 读写打开一个文本文件，允许读和写 <br /> <br />“wt+” 读写打开或建立一个文本文件，允许读写 <br />  “at+” 读写打开一个文本文件，允许读，或在文件末追加数据 <br />“rb+” 读写打开一个二进制文件，允许读和写 </font>
						</div>
						<div style="mso-line-spacing: '90 20 0'; mso-margin-left-alt: 216; mso-char-wrap: 1; mso-kinsoku-overflow: 1">
								<font size="2">“wb+”读写打开或建立一个二进制文件，允许读和写 <br />“ab+” 读写打开一个二进制文件，允许读，或在文件末追加数据 <br /> <br />•fopen()    <br />•fclose() <br />•putc() <br />•fputc() <br />•getc() <br />•fgetc() <br />•fseek() <br />•fprintf <br /> <br />•fscanf() <br />•feof() <br />•ferror() <br />•rewind() <br />•remove() <br />•fflush()</font>
								<br />
								<br />
						</div>
				</span>
		</div>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/11076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2006-08-10 08:55 <a href="http://www.cppblog.com/Backkom-Li/archive/2006/08/10/11076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Debug工具栏</title><link>http://www.cppblog.com/Backkom-Li/archive/2006/08/03/10810.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Thu, 03 Aug 2006 04:29:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2006/08/03/10810.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/10810.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2006/08/03/10810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/10810.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/10810.html</trackback:ping><description><![CDATA[
		<p align="center">
				<img height="616" alt="637.jpg" src="http://www.cppblog.com/images/cppblog_com/backkom-li/网络日志图片/637.jpg" width="530" border="0" />
		</p>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/10810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2006-08-03 12:29 <a href="http://www.cppblog.com/Backkom-Li/archive/2006/08/03/10810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中string和string.h的作用和区别【转帖】</title><link>http://www.cppblog.com/Backkom-Li/archive/2006/07/27/10580.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Thu, 27 Jul 2006 04:28:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2006/07/27/10580.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/10580.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2006/07/27/10580.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/10580.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/10580.html</trackback:ping><description><![CDATA[
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<font size="2">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">#include  </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #0000ff">string</span>
						<span style="COLOR: #000000">.h</span>
						<span style="COLOR: #000000">&gt;</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000">  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">void</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000">  main()  <br /><img id="Codehighlighter1_40_208_Open_Image" onclick="this.style.display='none'; Codehighlighter1_40_208_Open_Text.style.display='none'; Codehighlighter1_40_208_Closed_Image.style.display='inline'; Codehighlighter1_40_208_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_40_208_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_40_208_Closed_Text.style.display='none'; Codehighlighter1_40_208_Open_Image.style.display='inline'; Codehighlighter1_40_208_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_40_208_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
				</font>
				<span id="Codehighlighter1_40_208_Open_Text">
						<font size="2">
								<span style="COLOR: #000000">{  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       </span>
								<span style="COLOR: #0000ff">string</span>
								<span style="COLOR: #000000">  aaa</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">  </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">abcsd  d</span>
								<span style="COLOR: #000000">"</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000">;  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       printf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">looking  for  abc  from  abcdecd  %s\n</span>
								<span style="COLOR: #000000">"</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000">,  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />               (strcmp(aaa,</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">abc</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">))  </span>
								<span style="COLOR: #000000">?</span>
								<span style="COLOR: #000000">  </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">Found</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">  :  </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">Not  Found</span>
								<span style="COLOR: #000000">"</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000">);  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" /> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</font>
				</span>
				<font size="2">
						<span style="COLOR: #000000">  </span>
				</font>
		</div>
		<br />
		<font size="2">不能正确执行，提示说是string类型没有定义   </font>
		<p>
				<font size="2">而下面：  <br /></font>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<font size="2">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">#include  </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #0000ff">string</span>
						<span style="COLOR: #000000">&gt;</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000">  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<font style="BACKGROUND-COLOR: #ff1493">
								<font color="#000000">
										<span style="COLOR: #0000ff">using</span>
										<span style="COLOR: #000000">  </span>
										<span style="COLOR: #0000ff">namespace</span>
								</font>
						</font>
				</font>
				<font size="2">
						<span style="COLOR: #000000">
								<font style="BACKGROUND-COLOR: #ff1493" color="#000000">  std;</font>  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">void</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000">  main()  <br /><img id="Codehighlighter1_63_229_Open_Image" onclick="this.style.display='none'; Codehighlighter1_63_229_Open_Text.style.display='none'; Codehighlighter1_63_229_Closed_Image.style.display='inline'; Codehighlighter1_63_229_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_63_229_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_63_229_Closed_Text.style.display='none'; Codehighlighter1_63_229_Open_Image.style.display='inline'; Codehighlighter1_63_229_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_63_229_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
				</font>
				<span id="Codehighlighter1_63_229_Open_Text">
						<font size="2">
								<span style="COLOR: #000000">{  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       </span>
								<span style="COLOR: #0000ff">string</span>
								<span style="COLOR: #000000">  aaa</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">  </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">abcsd  d</span>
								<span style="COLOR: #000000">"</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000">;  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />       printf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">looking  for  abc  from  abcdecd  %s\n</span>
								<span style="COLOR: #000000">"</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000">,  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />               (strcmp(aaa,</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">abc</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">))  </span>
								<span style="COLOR: #000000">?</span>
								<span style="COLOR: #000000">  </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">Found</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">  :  </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">Not  Found</span>
								<span style="COLOR: #000000">"</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000">);  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</font>
				</span>
				<font size="2">
						<span style="COLOR: #000000">  </span>
				</font>
		</div>
		<p>
				<br />
				<font size="2">这里的string编译器就认识了，但是strcmp就不认识了呢？  <br /></font>
		</p>
		<p>
				<font size="2">一般一个C++的老的带“.h”扩展名的库文件，比如iostream.h，在新标准后的标准库中都有一个不带“.h”扩展名的相对应，区别除了后者的好多改进之外，还有一点就是后者的东东都塞进了“std”名字空间中。  <br /> <br /></font>
				<font size="2">
						<font color="#ff1493">但唯独string特别。  <br /></font>问题在于C++要兼容C的标准库，而C的标准库里碰巧也已经有一个名字叫做“string.h”的头文件，包含一些常用的C字符串处理函数，比如楼主提到的strcmp。  <br />这个头文件跟C++的string类半点关系也没有，所以&lt;string&gt;并非&lt;string.h&gt;的“升级版本”，他们是毫无关系的两个头文件。  <br />要达到楼主的目的，比如同时：  <br /></font>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<font size="2">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">#include  </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #0000ff">string</span>
						<span style="COLOR: #000000">.h</span>
						<span style="COLOR: #000000">&gt;</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000">  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include  </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #0000ff">string</span>
						<span style="COLOR: #000000">&gt;</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000">  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">using</span>
						<span style="COLOR: #000000">  </span>
						<span style="COLOR: #0000ff">namespace</span>
						<span style="COLOR: #000000">  std;  </span>
				</font>
		</div>
		<p>
				<br />
				<font size="2">或者  <br /></font>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<font size="2">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">#include  </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">cstring</span>
						<span style="COLOR: #000000">&gt;</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000">  <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include  </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #0000ff">string</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">  </span>
				</font>
		</div>
		<p>
				<br />
				<font size="2"> <br />其中&lt;cstring&gt;是与C标准库的&lt;string.h&gt;相对应，但裹有std名字空间的版本。</font>
		</p>
		<p>
				<font size="2">笑谈（来自高质量++） </font>
		</p>
		<p>
				<font size="2">C++标准库很大。非常大。难以置信的大。怎么个大法？这么说吧：在C++标准中，关于标准库的规格说明占了密密麻麻300 多页，这还不包括标准C 库，后者只是"作为参考"（老实说，原文就是用的这个词）包含在C++库中。当然，并非总是越大越好，但在现在的情况下，确实越大越好，因为大的库会包含大量的功能。标准库中的功能越多，开发自己的应用程序时能借助的功能就越多。C++库并非提供了一切（很明显的是，没有提供并发和图形用户接口的支持），但确实提供了很多。几乎任何事你都可以求助于它。在归纳标准库中有些什么之前，需要介绍一下它是如何组织的。因为标准库中东西如此之多，你（或象你一样的其他什么人）所选择的类名或函数名就很有可能和标准库中的某个名字相同。为了避免这种情况所造成的名字冲突，实际上标准库中的一切都被放在名字空间std 中（参见条款28）。但这带来了一个新问题。无数现有的C++代码都依赖于使用了多年的伪标准库中的功能，例如，声明在&lt;iostream.h&gt;，&lt;complex.h&gt;，&lt;limits.h&gt;等头文件中的功能。现有软件没有针对使用名字空间而进行设计，如果用std 来包装标准库导致现有代码不能用，将是一种可耻行为。（这种釜底抽薪的做法会让现有代码的程序员说出比"可耻" 更难听的话）慑于被激怒的程序员会产生的破坏力，标准委员会决定为包装了std 的那部分标准库构件创建新的头文件名。生成新头文件的方法仅仅是将现有C++头文件名中的.h 去掉，方法本身不重要，正如最后产生的结果不一致也并不重要一样。所以&lt;iostream.h&gt;变成了&lt;iostream&gt;，&lt;complex.h&gt;变成了&lt;complex&gt;，等等。对于C 头文件，采用同样的方法，但在每个名字前还要添加一个c。所以C 的&lt;string.h&gt;变成了&lt;cstring&gt;，&lt;stdio.h&gt;变成了&lt;cstdio&gt;，等等。最后一点是，旧的C++头文件是官方所反对使用的（即，明确列出不再支持），但旧的C 头文件则没有（以保持对C 的兼容性）。实际上，编译器制造商不会停止对客户现有软件提供支持，所以可以预计，旧的C++头文件在未来几年内还是会被支持。<br />所以，实际来说，下面是C++头文件的现状：<br /></font>
				<font color="#ff1493">
						<font size="2">旧的C++头文件名如&lt;iostream.h&gt;将会继续被支持，尽管它们不在官方标准中。这些头文件的内容不在名字空间std 中。<br />新的C++头文件如&lt;iostream&gt;包含的基本功能和对应的旧头文件相同，但头文件的内容在名字空间std 中。（在标准化的过程中，库中有些部分的细节被修改了，所以旧头文件和新头文件中的实体不一定完全对应。）<br />标准C 头文件如&lt;stdio.h&gt;继续被支持。头文件的内容不在std 中。<br />具有C 库功能的新C++头文件具有如&lt;cstdio&gt;这样的名字。它们提供的内容和相应的旧C 头文件相同，只是内容在std 中。<br />所有这些初看有点怪，但不难习惯它。最大的挑战是把字符串头文件理清楚：<br /></font>
						<font size="2">
								<font style="BACKGROUND-COLOR: #ee82ee" color="#800080">&lt;string.h&gt;是旧的C 头文件，对应的是基于char*的字符串处理函数；<br />&lt;cstring&gt;是对应于旧C 头文件的std 版本；<br />&lt;string&gt;是包装了std 的C++头文件，对应的是新的string 类。</font>
								<br />
						</font>
				</font>
				<font size="2">如果能掌握这些（我相信你能），其余的也就容易了。<br /></font>
		</p>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/10580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2006-07-27 12:28 <a href="http://www.cppblog.com/Backkom-Li/archive/2006/07/27/10580.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>指针函数和函数指针</title><link>http://www.cppblog.com/Backkom-Li/archive/2006/07/23/10364.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Sun, 23 Jul 2006 05:52:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2006/07/23/10364.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/10364.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2006/07/23/10364.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/10364.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/10364.html</trackback:ping><description><![CDATA[
		<font size="2">
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">#include <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_31_50_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_50_Open_Text.style.display='none'; Codehighlighter1_31_50_Closed_Image.style.display='inline'; Codehighlighter1_31_50_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_31_50_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_31_50_Closed_Text.style.display='none'; Codehighlighter1_31_50_Open_Image.style.display='inline'; Codehighlighter1_31_50_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> max(</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> x,</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> y)</span>
						<span id="Codehighlighter1_31_50_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_31_50_Open_Text">
								<span style="COLOR: #000000">{ </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000">(x</span>
								<span style="COLOR: #000000">&gt;</span>
								<span style="COLOR: #000000">y</span>
								<span style="COLOR: #000000">?</span>
								<span style="COLOR: #000000">x:y); }</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> main() <br /><img id="Codehighlighter1_67_205_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_205_Open_Text.style.display='none'; Codehighlighter1_67_205_Closed_Image.style.display='inline'; Codehighlighter1_67_205_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_67_205_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_205_Closed_Text.style.display='none'; Codehighlighter1_67_205_Open_Image.style.display='inline'; Codehighlighter1_67_205_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
						<span id="Codehighlighter1_67_205_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_67_205_Open_Text">
								<span style="COLOR: #000000">{ <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> (</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">ptr)(); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
								<span style="COLOR: #0000ff">int</span>
								<span style="COLOR: #000000"> a,b,c; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    ptr</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">max; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    scanf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">%d,%d</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">,</span>
								<span style="COLOR: #000000">&amp;</span>
								<span style="COLOR: #000000">a,</span>
								<span style="COLOR: #000000">&amp;</span>
								<span style="COLOR: #000000">b); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    c</span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000">(</span>
								<span style="COLOR: #000000">*</span>
								<span style="COLOR: #000000">ptr)(a,b); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    printf(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">a=%d,b=%d,max=%d</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">,a,b,c); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
						</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				</div>指针函数和函数指针有什么区别 <br /><br />1,这两个概念都是简称，指针函数是指带指针的函数，即本质是一个函数。我们知道函数都又返回类型（如果不返回值，则为无值型），只不过指针函数返回类型是某一类型的指针。其定义格式如下所示： <br /><br />返回类型标识符 *返回名称（形式参数表） <br />{ 函数体 } <br /><br />返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上，每一个函数，即使它不带有返回某种类型的指针，它本身都有一个入口地址，该地址相当于一个指针。比如函数返回一个整型值，实际上也相当于返回一个指针变量的值，不过这时的变量是函数本身而已，而整个函数相当于一个“变量”。例如下面一个返回指针函数的例子： <br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">find(); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />main() <br /><img id="Codehighlighter1_36_334_Open_Image" onclick="this.style.display='none'; Codehighlighter1_36_334_Open_Text.style.display='none'; Codehighlighter1_36_334_Closed_Image.style.display='inline'; Codehighlighter1_36_334_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_36_334_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_36_334_Closed_Text.style.display='none'; Codehighlighter1_36_334_Open_Image.style.display='inline'; Codehighlighter1_36_334_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_36_334_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_36_334_Open_Text"><span style="COLOR: #000000">{ <br /><img id="Codehighlighter1_67_109_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_109_Open_Text.style.display='none'; Codehighlighter1_67_109_Closed_Image.style.display='inline'; Codehighlighter1_67_109_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_67_109_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_109_Closed_Text.style.display='none'; Codehighlighter1_67_109_Open_Image.style.display='inline'; Codehighlighter1_67_109_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> score[][</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span id="Codehighlighter1_67_109_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_67_109_Open_Text"><span style="COLOR: #000000">{</span><span id="Codehighlighter1_68_80_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_68_80_Open_Text"><span style="COLOR: #000000">{</span><span style="COLOR: #000000">60</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">70</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">80</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">90</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">,</span><span id="Codehighlighter1_82_94_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_82_94_Open_Text"><span style="COLOR: #000000">{</span><span style="COLOR: #000000">56</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">89</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">34</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">45</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">,</span><span id="Codehighlighter1_96_108_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_96_108_Open_Text"><span style="COLOR: #000000">{</span><span style="COLOR: #000000">34</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">23</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">56</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">45</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i,m; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Enter the number to be found:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">m); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">the score of NO.%d are:\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,m); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">find(score,m); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%5.2f\t</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(p</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">i)); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_375_384_Open_Image" onclick="this.style.display='none'; Codehighlighter1_375_384_Open_Text.style.display='none'; Codehighlighter1_375_384_Closed_Image.style.display='inline'; Codehighlighter1_375_384_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_375_384_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_375_384_Closed_Text.style.display='none'; Codehighlighter1_375_384_Open_Image.style.display='inline'; Codehighlighter1_375_384_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">find(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pionter)[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">],</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> n)</span><span id="Codehighlighter1_375_384_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_375_384_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">定义指针函数</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"> <br /><img id="Codehighlighter1_387_445_Open_Image" onclick="this.style.display='none'; Codehighlighter1_387_445_Open_Text.style.display='none'; Codehighlighter1_387_445_Closed_Image.style.display='inline'; Codehighlighter1_387_445_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_387_445_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_387_445_Closed_Text.style.display='none'; Codehighlighter1_387_445_Open_Image.style.display='inline'; Codehighlighter1_387_445_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_387_445_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/images/dot.gif" /></span><span id="Codehighlighter1_387_445_Open_Text"><span style="COLOR: #000000">{ <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pt; <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    pt</span><span style="COLOR: #000000">=*</span><span style="COLOR: #000000">(pionter</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">n); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">(pt); <br /><img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"> <br /><img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" /></span></div><br />学生学号从0号算起，函数find()被定义为指针函数，起形参pointer是指针指向包含4个元素的一维数组的指针变量。pointer+1指向score的第一行。*(pointer+1)指向第一行的第0个元素。pt是一个指针变量，它指向浮点型变量。main()函数中调用find()函数，将score数组的首地址传给pointer. <br /><br />2,“函数指针”是指向函数的指针变量，因而“函数指针”本身首先应是指针变量，只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样，这里是指向函数。如前所述，C在编译时，每一个函数都有一个入口地址，该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后，可用该指针变量调用函数，就如同用指针变量可引用其他类型变量一样，在这些概念上一致的。函数指针有两个用途：调用函数和做函数的参数。函数指针不能绝对不能指向不同类型，或者是带不同形参的函数，在定义函数指针的时候我们很容易犯如下的错误。</font>
		<p>
				<font size="2">int *fp(int a);//这里是错误的，因为按照结合性和优先级来看就是先和()结合，然后变成了一个返回整形指针的函数了，而不是函数指针，这一点尤其需要注意！ </font>
		</p>
		<font size="2">函数指针的说明方法为: <br />数据类型标志符 （*指针变量名）（参数）；注：函数括号中的参数可有可无，视情况而定。 <br />下面的程序说明了函数指针调用函数的方法： <br /><br /><br />ptr是指向函数的指针变量，所以可把函数max()赋给ptr作为ptr的值，即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数，实际上ptr和max都指向同一个入口地址，不同就是ptr是一个指针变量，不像函数名称那样是死的，它可以指向任何函数，就看你像怎么做了。在程序中把哪个函数的地址赋给它，它就指向哪个函数。而后用指针变量调用它，因此可以先后指向不同的函数，不过注意，指向函数的指针变量没有++和--运算，用时要小心。 <br /></font>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/10364.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2006-07-23 13:52 <a href="http://www.cppblog.com/Backkom-Li/archive/2006/07/23/10364.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>良好的态度</title><link>http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10334.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Fri, 21 Jul 2006 11:42:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10334.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/10334.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10334.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/10334.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/10334.html</trackback:ping><description><![CDATA[
		<div>
				<font size="2">如果将英文字母A到Z分别编上1—26的分数，（A=1，B=2，...Z=26）那么: </font>
		</div>
		<div>
				<font size="2">知识（knowledge)得到96分（11+14+15+23+12+5+4+7+5=96）， <br />努力（hardwork）也只得98分（8+1+18+4+23+15+18+11=98）， <br />态度(attitude) ？？？</font>
		</div>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/10334.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2006-07-21 19:42 <a href="http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10334.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String &amp; string</title><link>http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10326.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Fri, 21 Jul 2006 11:38:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10326.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/10326.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/10326.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/10326.html</trackback:ping><description><![CDATA[
		<p>在BCB中<br />#include"CString.h"</p>
		<p>
				<font color="#ff0000">string</font> s="";//Ansistring<br /><font color="#ff0000">String</font> s="";//string两者是不同的</p>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/10326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2006-07-21 19:38 <a href="http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>union的迷思</title><link>http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10303.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Fri, 21 Jul 2006 04:56:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10303.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/10303.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10303.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/10303.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/10303.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">联合(union)在c/c++里面见得并不多，但是在一些对内存要求特别严格的地方，联合又是频繁出现，那么究竟什么是联合、怎么去用、有什么需要注意的地方呢？<br /><br />1、什么是联合？<br />　　 “联合”是一种特殊的类，也是一种构造类型的数据结构。 在一个“联合”内可以定义多种不同的数据类型， 一个被说明为该“联合”类型的变量中，允许装入该“联合”所定义的任何一种数据，这些数据共享同一段内存，已达到节省空间的目的（还有一个节省空间的类型：位域）。 这是一个非常特殊的地方，也是联合的特征。另外，同struct一样，联合默认访问权限也是公有的，并且，也具有成员函数。<br /><br />2、联合与结构的区别？<br />　　 “联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间， 一个结构变量的总长度是各成员长度之和（空结构除外，同时不考虑边界调整）。而在“联合”中，各成员共享一段内存空间， 一个联合变量的长度等于各成员中最长的长度。应该说明的是， 这里所谓的共享不是指把多个成员同时装入一个联合变量内， 而是指该联合变量可被赋予任一成员值，但每次只能赋一种值， 赋入新值则冲去旧值。<br /><br />3、如何定义？<br />　　 例如：<br />　　　 union test<br />　　　 &lt;<br />　　　　　 test() &lt; &gt;<br />　　　　　 int office;<br />　　　　　 char teacher[5];<br />　　　 &gt;; <br />　　　 定义了一个名为test的联合类型，它含有两个成员，一个为整型，成员名为office；另一个为字符数组，数组名为teacher。联合定义之后，即可进行联合变量说明，被说明为test类型的变量，可以存放整型量office或存放字符数组teacher。<br /><br />4、如何说明？<br />　　 联合变量的说明有三种形式：先定义再说明、定义同时说明和直接说明。<br />　　 以test类型为例，说明如下：<br />　　　 1) union test<br />　　　　　　 &lt;<br />　　　　　　　　 int office;<br />　　　　　　　　 char teacher[5];<br />　　　　　　 &gt;; <br />　　　　　　 union test a,b;　　　 /*说明a,b为test类型*/<br />　　　 2) union test<br />　　　　　　 &lt;<br />　　　　　　　　 int office;<br />　　　　　　　　 char teacher[5];<br />　　　　　　 &gt; a,b;<br />　　　 3) union <br />　　　　　　 &lt;<br />　　　　　　　　 int office;<br />　　　　　　　　 char teacher[5];<br />　　　　　　 &gt; a,b; <br />　　　　　　 经说明后的a,b变量均为test类型。<br />　　　 a,b变量的长度应等于test的成员中最长的长度，即等于teacher数组的长度，共5个字节。a,b变量如赋予整型值时，只使用了4个字节，而赋予字符数组时，可用5个字节。<br /><br />5、如何使用？<br />　　 对联合变量的赋值，使用都只能是对变量的成员进行。<br />　　 联合变量的成员表示为：联合变量名.成员名　 <br />　　 例如，a被说明为test类型的变量之后，可使用a.class、a.office　 <br />　　 不允许只用联合变量名作赋值或其它操作，也不允许对联合变量作初始化赋值，赋值只能在程序中进行。<br />　　 还要再强调说明的是，一个联合变量，每次只能赋予一个成员值。换句话说，一个联合变量的值就是联合变员的某一个成员值。<br /><br />6、匿名联合<br />　　 匿名联合仅仅通知编译器它的成员变量共同享一个地址,而变量本身是直接引用的,不使用通常的点号运算符语法.例如：<br />　　　　 #include &lt;iostream&gt;<br />　　　　 void main()<br />　　　　 &lt;<br />　　　　　　　　 union&lt;　 <br />　　　　　　　　　　　　　　　 int test;<br />　　　　　　　　　　　　　　　 char c;　 <br />　　　　　　　　　　　　　　 &gt;;　　　　　　　　　 <br />　　　　　　　 test=5;<br />　　　　　　　 c=a;<br />　　　　　　　 std::cout&lt;&lt;i&lt;&lt;" "&lt;&lt;c;<br />　　　　 &gt;<br />　　　 正如所见到的,联合成分象声明的普通局部变量那样被引用,事实上对于程序而言,这也正是使用这些变量的方式.另外,尽管被定义在一个联合声明中,他们与同一个程序快那的任何其他局部变量具有相同的作用域级别.这意味这匿名联合内的成员的名称不能与同一个作用域内的其他一直标志符冲突.<br />　　　 对匿名联合还存在如下限制:<br />　　　 因为匿名联合不使用点运算符，所以包含在匿名联合内的元素必须是数据,不允许有成员函数，也不能包含私有或受保护的成员。还有,全局匿名联合必须是静态(static)的，否则就必须放在匿名名字空间中。<br /><br />7、几点需要讨论的地方：<br />　　 1、联合里面那些东西不能存放？<br />　　　　　 我们知道，联合里面的东西共享内存，所以静态、引用都不能用，因为他们不可能共享内存。<br />　　 2、类可以放入联合吗？<br />　　　　　 我们先看一个例子：<br />　　　　　 class test<br />　　　　　 &lt;<br />　　　　　 public:<br />　　　 test():data(0) &lt; &gt;<br />　　　　　 private:<br />　　　　　　　　　 int data;<br />　　　　　 &gt;;<br /><br />　　　　 typedef union _test<br />　　　　 &lt;<br />　test test;　　 file://？？？？？？<br />　　　　 &gt;ui;　　 <br />　　　　 编译通不过，为什么呢？<br />　　　　 因为联合里不允许存放带有构造函数、析够函数、复制拷贝操作符等的类，因为他们共享内存，编译器无法保证这些对象不被破坏，也无法保证离开时调用析够函数。<br />　　　 3、又是匿名惹的祸？？<br />　　　　　　 我们先看下一段代码：　 <br />　class test<br />　&lt;<br />　　　　　　　 public:<br />　　　　　　　　　　　　 test(const　 char* p);<br />　　　　　　　　　　　　 test(int in);<br />　　　　　　　　　　　　 const operator char*() const <return data.ch;=""><br />　　　　　　　　　　　　 operator long() const <return data.l;=""><br />　　　　　　　 private:<br />　　　　 enum type <int, string="">;<br />　　　　　　　　　　　 union <br />　　　　 &lt;<br />　　const char* ch;<br />　　int i;<br />　　　　　 &gt;datatype;<br />　　　　　 type stype;<br />　　　　　 test(test&amp;);<br />　　　　　 test&amp; operator=(const test&amp;);<br />　　　　　　　 &gt;;<br />　　　　　　 test::test(const　 char *p):stype(string),datatype.ch(p)　　　　 &lt; &gt;<br />　　　　　　 test::test(int in):stype(int),datatype.l(i)　　　　 &lt; &gt;<br />　　　　 看出什么问题了吗？呵呵，编译通不过。为什么呢？难道datatype.ch(p)和datatype.l(i)有问题吗？<br />　　　　 哈哈，问题在哪呢？让我们来看看构造test对象时发生了什么，当创建test对象时，自然要调用其相应的构造函数，在构造函数中当然要调用其成员的构造函数，所以其要去调用datatype成员的构造函数，但是他没有构造函数可调用，所以出错。<br />　　　　 注意了，这里可并不是匿名联合！因为它后面紧跟了个data! <br />　　　 4、如何有效的防止访问出错？<br />　　　　　　 使用联合可以节省内存空间，但是也有一定的风险：通过一个不适当的数据成员获取当前对象的值！例如上面的ch、i交错访问。<br />　　　　　　 为了防止这样的错误，我们必须定义一个额外的对象，来跟踪当前被存储在联合中的值得类型，我们称这个额外的对象为：union的判别式。<br />　　　　　　 一个比较好的经验是，在处理作为类成员的union对象时，为所有union数据类型提供一组访问函数。</int,></return></return></font>
		</p>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/10303.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2006-07-21 12:56 <a href="http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10303.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>协议的定义及意义</title><link>http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10302.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Fri, 21 Jul 2006 04:45:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10302.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/10302.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10302.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/10302.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/10302.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">如何定义网络协议，它有哪些意义？ <br />    协议是对<font style="BACKGROUND-COLOR: #7fffd4">网络中设备以何种方式交换信息的一系列规定的组合</font>，它对信息交换的速率、传输代码、代码结构、传输控制步骤、出错控制等许多参数作出定义。 </font>
		</p>
		<p>
				<font size="2">　　网络是一个相互联结的大群体，因此要想加入到这个群体中来，就不能随心所欲，任由兴之所发。就好象一个国家或一个种族拥有自己的语言，大家都必须通晓并凭借这种语言来对话一样，相互联结的网络中各个节点也需要拥有共同的“语言”，依据它所定义的规则来控制数据的传递，这种语言便是大家经常听说的 “协议”。协议是对网络中设备以何种方式交换信息的一系列规定的组合，它对信息交换的速率、传输代码、代码结构、传输控制步骤、出错控制等许多参数作出定义。 </font>
		</p>
		<p>
				<font size="2">　　对网络始入门者来说，纷繁复杂的协议常常让人头痛不已—这些协议各起什么作用？它们之间又有什么联系？为什么有了A协议还需要补充B协议？这些问题搞不清楚，往往成为进一步学习的障碍。其实这个问题应该这样理解：是先有了各种不同语言的民族，后来随着社会的发展，才有了不同民族间交流的需求。网络也是这样，最初人们在小范围内建立网络，只需要自己作一些简单的约定，保证这一有限范围内的用户遵守就可以了；到后来网络规模越来越大，才考虑到制定更严格的规章制度即协议；而为了实现多个不同网络的互联，又会增加不少新协议作为补充，或成长为统一的新标准。 </font>
		</p>
		<p>
				<font size="2">　　数据在网络中由源传输到目的地，需要一系列的加工处理，为了便于理解，我们这里不妨打个比喻。如果我们把数据比做巧克力：我们可以把加工巧克力的设备作为源，而把消费者的手作为目的来看看会有什么样的传输过程。巧克力厂通常会为每块巧克力外边加上一层包装，然后还会将若干巧克力装入一个巧克力盒，再把几个巧克力盒一起装入一个外包装，运输公司还会把许多箱巧克力装入一个集装箱，到达消费者所在的城市后，又会由运输商、批发商、零售商、消费者打开不同的包装层。不同层次的包装、解包装需要不同的规范和设备，计算机网络也同样有不同的封装、传输层面，为此国际标准化组织ISO于1978 年提出“开放系统互连参考模型”，即著名的OSI(Open System Interconnection)七层模型，它将是我们后续篇幅中要介绍的内容，这里先不展开论述。 网络的协议就是用作这些不同的网络层的行为规范的。网络在发展过程中形成了很多不同的协议族，每一协议族都在网络的各层对应有相应的协议，其中作为Internet规范的是ICP/IP协议族，这也是我们今天要讲的。 </font>
		</p>
		<p>
				<font size="2">TCP/IP协议的定义以及层次、功能 </font>
		</p>
		<p>
				<font size="2">什么是TCP/IP协议，划为几层，各有什么功能？ <br />　　TCP/IP协议族包含了很多功能各异的子协议。为此我们也利用上文所述的分层的方式来剖析它的结构。<font style="BACKGROUND-COLOR: #7fffd4">TCP/IP层次模型共分为四层：应用层、传输层、网络层、数据链路层。 </font></font>
		</p>
		<p>
				<font size="2">TCP/IP网络协议 <br />　　TCP/IP(Transmission Control Protocol/Internet Protocol，传输控制协议/网间网协议)是目前世界上应用最为广泛的协议，它的流行与Internet的迅猛发展密切相关—TCP/IP最初是为互联网的原型ARPANET所设计的，目的是提供一整套方便实用、能应用于多种网络上的协议，事实证明TCP/IP做到了这一点，它使网络互联变得容易起来，并且使越来越多的网络加入其中，成为Internet的事实标准。 </font>
		</p>
		<p>
				<font size="2">* <font style="BACKGROUND-COLOR: #7fffd4">应用层</font>—应用层是所有用户所面向的应用程序的统称。ICP/IP协议族在这一层面有着很多协议来支持不同的应用，许多大家所熟悉的基于Internet的应用的实现就离不开这些协议。如我们进行万维网（WWW）访问用到了HTTP协议、文件传输用FTP协议、电子邮件发送用<font style="BACKGROUND-COLOR: #7fffd4">SMTP</font>、域名的解析用<font style="BACKGROUND-COLOR: #7fffd4">DNS</font>协议、 远程登录用<font style="BACKGROUND-COLOR: #7fffd4">Telnet</font>协议等等，都是属于TCP/IP应用层的；就用户而言，看到的是由一个个软件所构筑的大多为图形化的操作界面，而实际后台运行的便是上述协议。 </font>
		</p>
		<p>
				<font size="2">* <font style="BACKGROUND-COLOR: #7fffd4">传输层</font>—这一层的的功能主要是提供应用程序间的通信，TCP/IP协议族在这一层的协议有<font style="BACKGROUND-COLOR: #7fffd4">TCP和UDP</font>。 </font>
		</p>
		<p>
				<font size="2">* <font style="BACKGROUND-COLOR: #7fffd4">网络层</font>—是TCP/IP协议族中非常关键的一层，主要定义了IP地址格式，从而能够使得不同应用类型的数据在Internet上通畅地传输，<font style="BACKGROUND-COLOR: #7fffd4">IP协议</font>就是一个网络层协议。 </font>
		</p>
		<p>
				<font size="2">* <font style="BACKGROUND-COLOR: #7fffd4">网络接口层</font>—这是TCP/IP软件的最低层，负责接收IP数据包并通过网络发送之，或者从网络上接收物理帧，抽出IP数据报，交给IP层。 </font>
		</p>
		<p>
				<font size="2">1．TCP/UDP协议 <br />　　TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输，它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说，它是事先为所发送的数据开辟出连接好的通道，然后再进行数据发送；而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说，TCP对应的是可靠性要求高的应用，而UDP对应的则是可靠性要求低、传输经济的应用。TCP支持的应用协议主要有：Telnet、FTP、SMTP等；UDP支持的应用层协议主要有：NFS（网络文件系统）、SNMP（简单网络管理协议）、DNS（主域名称系统）、TFTP（通用文件传输协议）等。 </font>
		</p>
		<p>
				<font size="2">IP协议的定义、IP地址的分类及特点 </font>
		</p>
		<p>
				<font size="2">什么是IP协议，IP地址如何表示，分为几类，各有什么特点？ <br />　　为了便于寻址和层次化地构造网络，IP地址被分为A、B、C、D、E五类，商业应用中只用到A、B、C三类。 </font>
		</p>
		<p>
				<font size="2">　　IP协议(Internet Protocol)又称互联网协议，是支持网间互连的数据报协议，它与TCP协议（传输控制协议）一起构成了TCP/IP协议族的核心。它提供网间连接的完善功能， 包括IP数据报规定互连网络范围内的IP地址格式。 </font>
		</p>
		<p>
				<font size="2">　　Internet 上，为了实现连接到互联网上的结点之间的通信，必须为每个结点（入网的计算机）分配一个地址，并且应当保证这个地址是全网唯一的，这便是IP地址。 </font>
		</p>
		<p>
				<font size="2">　　目前的IP地址（IPv4：IP第4版本）由32个二进制位表示，每8位二进制数为一个整数，中间由小数点间隔，如159.226.41.98，整个IP地址空间有4组8位二进制数，由表示主机所在的网络的地址（类似部队的编号）以及主机在该网络中的标识（如同士兵在该部队的编号）共同组成。 </font>
		</p>
		<p>
				<font size="2">　　为了便于寻址和层次化的构造网络，IP地址被分为A、B、C、D、E五类，商业应用中只用到A、B、C三类。 </font>
		</p>
		<p>
				<font size="2">* A类地址：A类地址的网络标识由第一组8位二进制数表示，网络中的主机标识占3组8位二进制数，A类地址的特点是网络标识的第一位二进制数取值必须为“0”。不难算出，A类地址允许有126个网段，每个网络大约允许有1670万台主机，通常分配给拥有大量主机的网络（如主干网）。 </font>
		</p>
		<p>
				<font size="2">* B类地址：B类地址的网络标识由前两组8位二进制数表示，网络中的主机标识占两组8位二进制数，B类地址的特点是网络标识的前两位二进制数取值必须为“10”。B类地址允许有16384个网段，每个网络允许有65533台主机，适用于结点比较多的网络（如区域网）。 </font>
		</p>
		<p>
				<font size="2">* C类地址：C类地址的网络标识由前3组8位二进制数表示，网络中主机标识占1组8位二进制数，C类地址的特点是网络标识的前3位二进制数取值必须为“110”。具有C类地址的网络允许有254台主机，适用于结点比较少的网络（如校园网）。 </font>
		</p>
		<p>
				<font size="2">　　为了便于记忆，通常习惯采用4个十进制数来表示一个IP地址，十进制数之间采用句点“.”予以分隔。这种IP地址的表示方法也被称为点分十进制法。如以这种方式表示，A类网络的IP地址范围为1.0.0.1－127.255.255.254；B类网络的IP地址范围为：128.1.0.1－191.255.255.254；C类网络的IP地址范围为：192.0.1.1－223.255.255.254。 </font>
		</p>
		<p>
				<font size="2">　　由于网络地址紧张、主机地址相对过剩，采取子网掩码的方式来指定网段号。 </font>
		</p>
		<p>
				<font size="2">　　TCP/IP协议与低层的数据链路层和物理层无关，这也是TCP/IP的重要特点。正因为如此 ，它能广泛地支持由低两层协议构成的物理网络结构。目前已使用TCP/IP连接成洲际网、全国网与跨地区网。</font>
		</p>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/10302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2006-07-21 12:45 <a href="http://www.cppblog.com/Backkom-Li/archive/2006/07/21/10302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>输出素数代码</title><link>http://www.cppblog.com/Backkom-Li/archive/2006/07/19/10233.html</link><dc:creator>在寒风中叶落</dc:creator><author>在寒风中叶落</author><pubDate>Wed, 19 Jul 2006 12:46:00 GMT</pubDate><guid>http://www.cppblog.com/Backkom-Li/archive/2006/07/19/10233.html</guid><wfw:comment>http://www.cppblog.com/Backkom-Li/comments/10233.html</wfw:comment><comments>http://www.cppblog.com/Backkom-Li/archive/2006/07/19/10233.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Backkom-Li/comments/commentRss/10233.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Backkom-Li/services/trackbacks/10233.html</trackback:ping><description><![CDATA[
		<p> </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">#include</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">iostream</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />#include</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">memory</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">using</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">namespace</span>
				<span style="COLOR: #000000"> std;<br /></span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">#define iMax 1000000</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #008000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 8</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">#define</span>
				<span style="COLOR: #000000"> iMax 100</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080"> 9</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> Odd[iMax];<br /></span>
				<span style="COLOR: #008080">11</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">12</span>
				<span style="COLOR: #000000">
						<img src="http://www.cppblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000"> main()<br /></span>
				<span style="COLOR: #008080">13</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_128_345_Open_Image" onclick="this.style.display='none'; Codehighlighter1_128_345_Open_Text.style.display='none'; Codehighlighter1_128_345_Closed_Image.style.display='inline'; Codehighlighter1_128_345_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_128_345_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_128_345_Closed_Text.style.display='none'; Codehighlighter1_128_345_Open_Image.style.display='inline'; Codehighlighter1_128_345_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_128_345_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.cppblog.com/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_128_345_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080">14</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    memset(Odd,</span>
						<span style="COLOR: #0000ff">true</span>
						<span style="COLOR: #000000">,</span>
						<span style="COLOR: #0000ff">sizeof</span>
						<span style="COLOR: #000000">(Odd));<br /></span>
						<span style="COLOR: #008080">15</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">for</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> i</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">;i</span>
						<span style="COLOR: #000000">&lt;=</span>
						<span style="COLOR: #000000">iMax</span>
						<span style="COLOR: #000000">/</span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">;i</span>
						<span style="COLOR: #000000">++</span>
						<span style="COLOR: #000000">)<br /></span>
						<span style="COLOR: #008080">16</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_190_275_Open_Image" onclick="this.style.display='none'; Codehighlighter1_190_275_Open_Text.style.display='none'; Codehighlighter1_190_275_Closed_Image.style.display='inline'; Codehighlighter1_190_275_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_190_275_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_190_275_Closed_Text.style.display='none'; Codehighlighter1_190_275_Open_Image.style.display='inline'; Codehighlighter1_190_275_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_190_275_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.cppblog.com/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_190_275_Open_Text">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">17</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(Odd[i])<br /></span>
								<span style="COLOR: #008080">18</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_207_272_Open_Image" onclick="this.style.display='none'; Codehighlighter1_207_272_Open_Text.style.display='none'; Codehighlighter1_207_272_Closed_Image.style.display='inline'; Codehighlighter1_207_272_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_207_272_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_207_272_Closed_Text.style.display='none'; Codehighlighter1_207_272_Open_Image.style.display='inline'; Codehighlighter1_207_272_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_207_272_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.cppblog.com/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_207_272_Open_Text">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">19</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
										<span style="COLOR: #0000ff">for</span>
										<span style="COLOR: #000000">(</span>
										<span style="COLOR: #0000ff">int</span>
										<span style="COLOR: #000000"> j</span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000">1</span>
										<span style="COLOR: #000000">;j</span>
										<span style="COLOR: #000000">&lt;</span>
										<span style="COLOR: #000000">iMax</span>
										<span style="COLOR: #000000">/</span>
										<span style="COLOR: #000000">i;j</span>
										<span style="COLOR: #000000">++</span>
										<span style="COLOR: #000000">)<br /></span>
										<span style="COLOR: #008080">20</span>
										<span style="COLOR: #000000">
												<img id="Codehighlighter1_241_268_Open_Image" onclick="this.style.display='none'; Codehighlighter1_241_268_Open_Text.style.display='none'; Codehighlighter1_241_268_Closed_Image.style.display='inline'; Codehighlighter1_241_268_Closed_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
												<img id="Codehighlighter1_241_268_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_241_268_Closed_Text.style.display='none'; Codehighlighter1_241_268_Open_Image.style.display='inline'; Codehighlighter1_241_268_Open_Text.style.display='inline';" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span>
										<span id="Codehighlighter1_241_268_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
												<img src="http://www.cppblog.com/images/dot.gif" />
										</span>
										<span id="Codehighlighter1_241_268_Open_Text">
												<span style="COLOR: #000000">{<br /></span>
												<span style="COLOR: #008080">21</span>
												<span style="COLOR: #000000">
														<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />                Odd[i</span>
												<span style="COLOR: #000000">+</span>
												<span style="COLOR: #000000">i</span>
												<span style="COLOR: #000000">*</span>
												<span style="COLOR: #000000">j]</span>
												<span style="COLOR: #000000">=</span>
												<span style="COLOR: #0000ff">false</span>
												<span style="COLOR: #000000">;<br /></span>
												<span style="COLOR: #008080">22</span>
												<span style="COLOR: #000000">
														<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span>
										</span>
										<span style="COLOR: #000000">
												<br />
										</span>
										<span style="COLOR: #008080">23</span>
										<span style="COLOR: #000000">
												<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
								</span>
								<span style="COLOR: #008080">24</span>
								<span style="COLOR: #000000">
										<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<span style="COLOR: #008080">25</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">for</span>
						<span style="COLOR: #000000">(</span>
						<span style="COLOR: #0000ff">int</span>
						<span style="COLOR: #000000"> k</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">;k</span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">iMax;k</span>
						<span style="COLOR: #000000">++</span>
						<span style="COLOR: #000000">)<br /></span>
						<span style="COLOR: #008080">26</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">(Odd[k])<br /></span>
						<span style="COLOR: #008080">27</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />            cout </span>
						<span style="COLOR: #000000">&lt;&lt;</span>
						<span style="COLOR: #000000">k</span>
						<span style="COLOR: #000000">&lt;&lt;</span>
						<span style="COLOR: #000000">endl;<br /></span>
						<span style="COLOR: #008080">28</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">;<br /></span>
						<span style="COLOR: #008080">29</span>
						<span style="COLOR: #000000">
								<img src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
<img src ="http://www.cppblog.com/Backkom-Li/aggbug/10233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Backkom-Li/" target="_blank">在寒风中叶落</a> 2006-07-19 20:46 <a href="http://www.cppblog.com/Backkom-Li/archive/2006/07/19/10233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>