﻿<?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=