﻿<?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++博客-笔记-文章分类-C/C++ and ASM</title><link>http://www.cppblog.com/einz/category/9163.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 08 Jul 2009 03:58:39 GMT</lastBuildDate><pubDate>Wed, 08 Jul 2009 03:58:39 GMT</pubDate><ttl>60</ttl><item><title>参数传值的理解</title><link>http://www.cppblog.com/einz/articles/76713.html</link><dc:creator>EiN</dc:creator><author>EiN</author><pubDate>Mon, 16 Mar 2009 03:32:00 GMT</pubDate><guid>http://www.cppblog.com/einz/articles/76713.html</guid><wfw:comment>http://www.cppblog.com/einz/comments/76713.html</wfw:comment><comments>http://www.cppblog.com/einz/articles/76713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/einz/comments/commentRss/76713.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/einz/services/trackbacks/76713.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; FONT-FAMILY: Lucida Console; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;test1(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">p,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">l)<br><img id=Codehighlighter1_30_41_Open_Image style="DISPLAY: inline" onclick="this.style.display='none'; Codehighlighter1_30_41_Open_Text.style.display='none'; Codehighlighter1_30_41_Closed_Image.style.display='inline'; Codehighlighter1_30_41_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_30_41_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_30_41_Closed_Text.style.display='none'; Codehighlighter1_30_41_Open_Image.style.display='inline'; Codehighlighter1_30_41_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_30_41_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_30_41_Open_Text style="DISPLAY: inline"><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;l;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;test2(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">l)<br><img id=Codehighlighter1_73_83_Open_Image style="DISPLAY: inline" onclick="this.style.display='none'; Codehighlighter1_73_83_Open_Text.style.display='none'; Codehighlighter1_73_83_Closed_Image.style.display='inline'; Codehighlighter1_73_83_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_73_83_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_73_83_Closed_Text.style.display='none'; Codehighlighter1_73_83_Open_Image.style.display='inline'; Codehighlighter1_73_83_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_73_83_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_73_83_Open_Text style="DISPLAY: inline"><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;l;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_98_187_Open_Image style="DISPLAY: inline" onclick="this.style.display='none'; Codehighlighter1_98_187_Open_Text.style.display='none'; Codehighlighter1_98_187_Closed_Image.style.display='inline'; Codehighlighter1_98_187_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_98_187_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_98_187_Closed_Text.style.display='none'; Codehighlighter1_98_187_Open_Image.style.display='inline'; Codehighlighter1_98_187_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_98_187_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_98_187_Open_Text style="DISPLAY: inline"><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;s[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0123456789</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">l&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;test1(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">p,&nbsp;l);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;test2(p,&nbsp;l);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>注意使用**p来达到更改效果<br>多一层指针指向，可以用来管理外面的指针 
<img src ="http://www.cppblog.com/einz/aggbug/76713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/einz/" target="_blank">EiN</a> 2009-03-16 11:32 <a href="http://www.cppblog.com/einz/articles/76713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符编码总结</title><link>http://www.cppblog.com/einz/articles/74250.html</link><dc:creator>EiN</dc:creator><author>EiN</author><pubDate>Thu, 19 Feb 2009 02:09:00 GMT</pubDate><guid>http://www.cppblog.com/einz/articles/74250.html</guid><wfw:comment>http://www.cppblog.com/einz/comments/74250.html</wfw:comment><comments>http://www.cppblog.com/einz/articles/74250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/einz/comments/commentRss/74250.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/einz/services/trackbacks/74250.html</trackback:ping><description><![CDATA[人们制定了一个表，表里面包含要表示的文字：character set 给每个字标号：coded character set 每个编号转化为计算机存储形式：character encoding form unicode制定了一个表，一堆字为他们标号，每个字得到一个code point，范围:0x0~0x10ffff，中间有段是空的，没有映射任何字转化为计算机形式，这个转化方法有多种模式，UTF-8,UTF-16等 对于UTF-16，在BMP基本字符平面上直接用code point(码点)的16进制形式表示为2个字节对于不在BMP范围内的特殊字符，采用两个码点共同表示，这两个码点的取值就是来自编码过的字符集中未映射的空白区域，所以单个这种码点没有任何对应字 
<img src ="http://www.cppblog.com/einz/aggbug/74250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/einz/" target="_blank">EiN</a> 2009-02-19 10:09 <a href="http://www.cppblog.com/einz/articles/74250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>const tip</title><link>http://www.cppblog.com/einz/articles/72644.html</link><dc:creator>EiN</dc:creator><author>EiN</author><pubDate>Wed, 28 Jan 2009 00:41:00 GMT</pubDate><guid>http://www.cppblog.com/einz/articles/72644.html</guid><wfw:comment>http://www.cppblog.com/einz/comments/72644.html</wfw:comment><comments>http://www.cppblog.com/einz/articles/72644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/einz/comments/commentRss/72644.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/einz/services/trackbacks/72644.html</trackback:ping><description><![CDATA[函数参数是int *n,要对它赋予一个const int cnt的值.<br>如果用语句n=&amp;cnt,那要报错,但换个写法*n=cnt就可以了.<br><br>
<img src ="http://www.cppblog.com/einz/aggbug/72644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/einz/" target="_blank">EiN</a> 2009-01-28 08:41 <a href="http://www.cppblog.com/einz/articles/72644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>__cdecl、__stdcall、__pascal、__fastcall：寄存器小实验</title><link>http://www.cppblog.com/einz/articles/70553.html</link><dc:creator>EiN</dc:creator><author>EiN</author><pubDate>Sun, 28 Dec 2008 01:59:00 GMT</pubDate><guid>http://www.cppblog.com/einz/articles/70553.html</guid><wfw:comment>http://www.cppblog.com/einz/comments/70553.html</wfw:comment><comments>http://www.cppblog.com/einz/articles/70553.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/einz/comments/commentRss/70553.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/einz/services/trackbacks/70553.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%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000; FONT-FAMILY: Lucida Console">//---------------------------------------------------------------------------<br></span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console"><br>#pragma&nbsp;hdrstop<br><br></span><span style="COLOR: #008000; FONT-FAMILY: Lucida Console">//---------------------------------------------------------------------------<br></span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">char</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;one()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">return</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;'a';<br>}<br></span><span style="COLOR: #008000; FONT-FAMILY: Lucida Console">//---------------------------------------------------------------------------<br></span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">__int16&nbsp;two()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">return</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;1;<br>}<br></span><span style="COLOR: #008000; FONT-FAMILY: Lucida Console">//---------------------------------------------------------------------------<br></span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">__int32&nbsp;four()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">return</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;2;<br>}<br></span><span style="COLOR: #008000; FONT-FAMILY: Lucida Console">//---------------------------------------------------------------------------<br></span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">__int64&nbsp;eight()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">return</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;3;<br>}<br></span><span style="COLOR: #008000; FONT-FAMILY: Lucida Console">//---------------------------------------------------------------------------<br></span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">#pragma&nbsp;argsused<br></span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">int</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;main(</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">int</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">char</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">*&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">char</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;i&nbsp;=&nbsp;one();<br>&nbsp;&nbsp;&nbsp;&nbsp;__int16&nbsp;ii&nbsp;=&nbsp;two();<br>&nbsp;&nbsp;&nbsp;&nbsp;__int32&nbsp;iv&nbsp;=&nbsp;four();<br>&nbsp;&nbsp;&nbsp;&nbsp;__int64&nbsp;viii&nbsp;=&nbsp;eight();<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">return</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;0;<br>}<br></span><span style="COLOR: #008000; FONT-FAMILY: Lucida Console">//</span><span style="COLOR: #008000"><span style="FONT-FAMILY: Lucida Console">---------------------------------------------------------------------------</span><br></span></div>
<br>自己写的小实验，因为突然对asm产生了兴趣。<br>在跟踪的时候会发现：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: Lucida Console; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000"><br>mov&nbsp;al,&nbsp;</span><span style="COLOR: #000000">0x61</span><span style="COLOR: #000000">&nbsp;;&nbsp;</span><span style="COLOR: #0000ff">return</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"><br><br>mov&nbsp;ax,&nbsp;</span><span style="COLOR: #000000">0x0001</span><span style="COLOR: #000000">&nbsp;;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br><br>mov&nbsp;eax,&nbsp;</span><span style="COLOR: #000000">0x00000002</span><span style="COLOR: #000000">&nbsp;;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000"><br><br>mov&nbsp;eax,&nbsp;</span><span style="COLOR: #000000">0x00000003</span><span style="COLOR: #000000">&nbsp;;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000"><br>xor&nbsp;edx,&nbsp;edx</span></div>
<br>这说明，对于1个byte的数据用的是al，2byte用的是ax，4byte用的是eax，而8byte用的是eax和edx，且eax存储低位，edx存储高位。<br><br>另有：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: Lucida Console; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">push&nbsp;ebp<br>mov&nbsp;ebp,&nbsp;esp</span></div>
<br>这在进入每个函数都会出现，是因为ebp是堆栈指针，用来在堆栈中查找数据，而esp永远指向堆栈头部。mov给ebp相当于给了段位号，ebp就是偏移。<br><br>下面关于那几个函数标识:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008000; FONT-FAMILY: Lucida Console">//---------------------------------------------------------------------------<br></span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console"><br>#pragma&nbsp;hdrstop<br><br></span><span style="COLOR: #008000; FONT-FAMILY: Lucida Console">//---------------------------------------------------------------------------<br></span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">void</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;__cdecl&nbsp;cde(</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">int</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;a,&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">int</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;b)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;+=&nbsp;b;<br>}<br></span><span style="COLOR: #008000; FONT-FAMILY: Lucida Console">//---------------------------------------------------------------------------<br></span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">int</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;__stdcall&nbsp;std(</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">int</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;a,&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">int</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;b)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;a&nbsp;+&nbsp;b;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">return</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;a;<br>}<br></span><span style="COLOR: #008000; FONT-FAMILY: Lucida Console">//---------------------------------------------------------------------------<br></span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">int</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;__pascal&nbsp;pas(</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">int</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;a,&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">int</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;b)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">if</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;(&nbsp;a*b&nbsp;&gt;&nbsp;30&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">return</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;b;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">else</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console"><br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;+=&nbsp;b;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pas(a,&nbsp;b);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #008000; FONT-FAMILY: Lucida Console">//---------------------------------------------------------------------------<br></span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">void</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;__fastcall&nbsp;fst(</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">int</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;a,&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">int</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;b)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;+=&nbsp;b;<br>}<br></span><span style="COLOR: #008000; FONT-FAMILY: Lucida Console">//---------------------------------------------------------------------------<br></span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console"><br>#pragma&nbsp;argsused<br></span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">int</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;main(</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">int</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">char</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">*&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;cde(1,&nbsp;2);<br>&nbsp;&nbsp;&nbsp;&nbsp;std(2,&nbsp;3);<br>&nbsp;&nbsp;&nbsp;&nbsp;pas(3,&nbsp;4);<br>&nbsp;&nbsp;&nbsp;&nbsp;fst(4,&nbsp;5);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">return</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;0;<br>}<br></span><span style="COLOR: #008000; FONT-FAMILY: Lucida Console">//</span><span style="COLOR: #008000"><span style="FONT-FAMILY: Lucida Console">---------------------------------------------------------------------------</span><br></span></div>
<br>然后跟踪进去：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: Lucida Console; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">cde:<br>push&nbsp;</span><span style="COLOR: #000000">0x02</span><span style="COLOR: #000000"><br>push&nbsp;</span><span style="COLOR: #000000">0x01</span><span style="COLOR: #000000"><br><br>std:<br>push&nbsp;</span><span style="COLOR: #000000">0x03</span><span style="COLOR: #000000"><br>push&nbsp;</span><span style="COLOR: #000000">0x02</span><span style="COLOR: #000000"><br><br>pas:<br>push&nbsp;</span><span style="COLOR: #000000">0x03</span><span style="COLOR: #000000"><br>push&nbsp;</span><span style="COLOR: #000000">0x04</span><span style="COLOR: #000000"><br><br>fst<br>mov&nbsp;edx,&nbsp;</span><span style="COLOR: #000000">0x00000005</span><span style="COLOR: #000000"><br>mov&nbsp;eax,&nbsp;</span><span style="COLOR: #000000">0x00000004</span><span style="COLOR: #000000"><br><br>a&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;b<br>mov&nbsp;eax,&nbsp;[ebp</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">0x0c</span><span style="COLOR: #000000">]&nbsp;;&nbsp;b<br>add&nbsp;[ebp</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">0x08</span><span style="COLOR: #000000">],&nbsp;eax&nbsp;;&nbsp;b</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">a<br><br>fst<br>mov&nbsp;[ebp</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">0x08</span><span style="COLOR: #000000">],&nbsp;edx&nbsp;;&nbsp;b<br>mov&nbsp;[ebp</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">0x04</span><span style="COLOR: #000000">],&nbsp;eax&nbsp;;&nbsp;a</span></div>
<br>这说明：<br>__cdecl和__stdcall都是从右向左压入参数，<br>__pascal是从左向右压入参数，<br>__fastcall根本就不用内存来存储参数，直接存储在寄存器里面，不过最后那个fst可以看出__fastcall还是又回到内存去了，这点不是很明白。<br>所以__fastcall是要快的多，其他的变量都存储在内存区域上（不可能一直在寄存器，因为寄存器是大家公用的），它们要操作必须先mov到寄存器上来，而fst就不用，但是同时：寄存器的数量很少，容量很小。<br><br>这里想到自己之前的一个严重错误，就是因为在不同编译器下如vc和bc它们给这些标识函数的名称都是不一样的，所以千万不能只以为它们只有名称的不同，这是个很严重的错误，程序必然会死的很惨。其实动动手就知道了，google上讲的都是知识点，来的不实在。<br><br>
<img src ="http://www.cppblog.com/einz/aggbug/70553.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/einz/" target="_blank">EiN</a> 2008-12-28 09:59 <a href="http://www.cppblog.com/einz/articles/70553.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vft、vptr、thunk</title><link>http://www.cppblog.com/einz/articles/69851.html</link><dc:creator>EiN</dc:creator><author>EiN</author><pubDate>Fri, 19 Dec 2008 10:09:00 GMT</pubDate><guid>http://www.cppblog.com/einz/articles/69851.html</guid><wfw:comment>http://www.cppblog.com/einz/comments/69851.html</wfw:comment><comments>http://www.cppblog.com/einz/articles/69851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/einz/comments/commentRss/69851.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/einz/services/trackbacks/69851.html</trackback:ping><description><![CDATA[对于vft（vitrual function table或是vitrual method table）和vptr（vitrual pointer）做一些总结。<br><br>当类中有虚函数的时候才会建立vft，这个表里面按照顺序（从0开始）和类里面的虚函数做出对应。<br>如果一个类里面有虚函数（就是有vft），那它就有个vptr。vptr是一个存在在类中的一个隐含指针，这个指针指向的是vft这个表。<br>当调用类中的某个虚函数的时候，就通过这个指针去找vft里面对应的函数，然后拿来调用。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: Lucida Console; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Base<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;FunctionPointer&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">__vptr;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;function1()&nbsp;{};<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;function2()&nbsp;{};<br>};<br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;D1:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Base<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;function1()&nbsp;{};<br>};<br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;D2:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Base<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;function2()&nbsp;{};<br>};<br></span></div>
<br>这里显示的把vptr显示出来，但实际上是看不见的。<br><br><img src="http://www.cppblog.com/images/cppblog_com/einz/VTable.gif" border=0><br>注意d1和d2的vptr是继承自base的<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #0000ff; FONT-FAMILY: Lucida Console">int</span><span style="COLOR: #000000; FONT-FAMILY: Lucida Console">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;D1&nbsp;cClass;<br>&nbsp;&nbsp;&nbsp;&nbsp;Base&nbsp;*pClass&nbsp;=&nbsp;&amp;</span><span style="COLOR: #000000"><span style="FONT-FAMILY: Lucida Console">cClass;<br>&nbsp;&nbsp;&nbsp; pClass-&gt;function1();<br style="FONT-FAMILY: Lucida Console"></span><span style="FONT-FAMILY: Lucida Console">}</span><br></span></div>
<br>上面的代码之所以可以执行，是因为：pClass指针指向的仅仅是cClass中属于Base的部分（因为Base是D1的父类），因为vptr原本是在Base中的（虽然看不见），所以pClass是可以调用vptr的。再由于继承的关系，此时的vptr处于D1类中，它指向的是D1的vft，所以pClass-&gt;funtion1()<span style="COLOR: #000000"><span style="FONT-FAMILY: Lucida Console">这句可以</span></span>执行成功。<br><br>说一个复杂的情况：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: Lucida Console; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;A<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;a();<br>};<br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;B&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;A<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;a();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;c();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;f();<br>};<br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;C&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;A<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;e();<br>};<br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;D&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;B,&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;C<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;a();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;g();<br>}:</span></div>
<br>这里就有点问题，如果单纯的vft中按照函数顺序的话。在D这个类中，来自B和来自C这两个类中的B::c函数和C::e函数在他们的类中所在的位置从文本上看都是第二的位置（C类还有个A中继承的a函数）。那么对于D来说有同一个位置有两个函数，这时vft必然不能正常实现。在C++中其实D这个类有两个vft，一个基于B建立，一个基于C建立。当然这种情况下只有在多继承时才出现。<br><br>那么在实际运行时，首先要把vft的地址（也就是vptr的值）放到寄存器里面，然后要确定用的是哪个类的vft（对于D这个类来说），接着再索引这个函数表找到函数，最后才根据地址执行函数。<br><br>也就只对于多继承这种复杂的情况下，才有上面这么多步骤。对于单继承，只用找到表，找到索引，找到函数，调用即可。GCC的thunk在建立vft的时候就确定了到底这个函数是在哪个对象<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: Lucida Console; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">load&nbsp;[object_reg</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">#VFToffset],&nbsp;table_reg<br>load&nbsp;[table_reg</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">#deltaOffset],&nbsp;delta_reg<br>load&nbsp;[table_reg</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">#numOffset],&nbsp;method_reg<br>add&nbsp;object_reg,&nbsp;delta_reg,&nbsp;object_reg<br>call&nbsp;method_reg</span></div>
<br>上面的汇编取自一篇论文，VFToffset就是vft的地址偏移，deltaOffset就是多继承产生的偏移（选哪个类，B还是C），numOffset就是函数偏移。省去的就是2、4这两条语句，thunk把这步做了。<br><br>关于thunk还是有点问题，不是非常明白。<br>
<img src ="http://www.cppblog.com/einz/aggbug/69851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/einz/" target="_blank">EiN</a> 2008-12-19 18:09 <a href="http://www.cppblog.com/einz/articles/69851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>static、作用域、连接属性</title><link>http://www.cppblog.com/einz/articles/69847.html</link><dc:creator>EiN</dc:creator><author>EiN</author><pubDate>Fri, 19 Dec 2008 09:03:00 GMT</pubDate><guid>http://www.cppblog.com/einz/articles/69847.html</guid><wfw:comment>http://www.cppblog.com/einz/comments/69847.html</wfw:comment><comments>http://www.cppblog.com/einz/articles/69847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/einz/comments/commentRss/69847.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/einz/services/trackbacks/69847.html</trackback:ping><description><![CDATA[关于之前比较迷惑的static和作用域问题的一点总结。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #0000ff; font-family: Lucida Console;"></span><span style="color: #008000; font-family: Lucida Console;"></span><span style="color: #0000ff; font-family: Lucida Console;">static</span><span style="color: #000000; font-family: Lucida Console;">&nbsp;</span><span style="color: #0000ff; font-family: Lucida Console;">int</span><span style="color: #000000; font-family: Lucida Console;">&nbsp;n;&nbsp;</span><span style="color: #008000; font-family: Lucida Console;">//&nbsp;file&nbsp;scoped&nbsp;ariable&nbsp;&nbsp;<br></span><span style="color: #0000ff; font-family: Lucida Console;">float</span><span style="color: #000000; font-family: Lucida Console;">&nbsp;f;&nbsp;</span><span style="color: #008000; font-family: Lucida Console;">//&nbsp;global&nbsp;variable&nbsp;&nbsp;<br></span><span style="color: #000000; font-family: Lucida Console;">&nbsp;<br></span><span style="color: #0000ff; font-family: Lucida Console;">int</span><span style="color: #000000; font-family: Lucida Console;">&nbsp;main()&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Lucida Console;">double</span><span style="color: #000000; font-family: Lucida Console;">&nbsp;d;&nbsp;</span><span style="color: #008000; font-family: Lucida Console;">//&nbsp;local&nbsp;variable&nbsp;&nbsp;<br></span><span style="color: #000000;"><span style="font-family: Lucida Console;">}</span>&nbsp;&nbsp;</span></div>
<br>变量f的范围可以说是global也可以说超出了所在文件。每个变量都有一个连接属性，用于在连接时判断其他文件是否有权利指向这个变量。这里的f声明，c++默认给它了一个连接属性：extern，也就是说在其他文件中，可以使用这个变量，当然前提是你包含了此文件，或者在一个工程里面（因为它是连接属性）。对于变量n，前面的static导致这个变量的连接属性为：此文件，就是说外部文件无法使用它。<br><br>
static之所以引起混淆，是因为一开始学的时候，它的应用在于把上面这个d，这个局部变量变的固定。讲到static必然有个例子，是在函数中有个局部变量，然后声明为static，接着自增，之后神奇的发现变量居然没有自动释放。这其实还是个局部变量，出了函数是没法使用的。<br><br>对于extern，常用的做法还有：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: Lucida Console;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">extern</span><span style="color: #000000;"> int array[];</span></div>
这样在头文件里面声明一个数组类型，然后在cpp中定义它。<br><br> <img src ="http://www.cppblog.com/einz/aggbug/69847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/einz/" target="_blank">EiN</a> 2008-12-19 17:03 <a href="http://www.cppblog.com/einz/articles/69847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>