﻿<?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++博客-franksunny的个人技术空间-随笔分类-C/C++学习和实践</title><link>http://www.cppblog.com/franksunny/category/2850.html</link><description>获得人生中的成功需要的专注与坚持不懈多过天才与机会。

                       ——C.W. Wendte</description><language>zh-cn</language><lastBuildDate>Thu, 22 Apr 2010 11:53:19 GMT</lastBuildDate><pubDate>Thu, 22 Apr 2010 11:53:19 GMT</pubDate><ttl>60</ttl><item><title>关于Symbian识别移动、联通和其它运营商网络的方法</title><link>http://www.cppblog.com/franksunny/archive/2010/04/22/113265.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Thu, 22 Apr 2010 11:13:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2010/04/22/113265.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/113265.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2010/04/22/113265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/113265.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/113265.html</trackback:ping><description><![CDATA[<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<h2 style="MARGIN: 13pt 0cm"><font size=5><font color=#000000><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">关于</span><span lang=EN-US><font face=Arial>Symbian</font></span><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">识别移动、联通和其它运营商网络的方法</span></font></font></h2>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自从</span><span lang=EN-US>Symbian OS</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span lang=EN-US>EKA2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了强大的</span><span lang=EN-US>CTelephony</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，这之后很多跟网络相关的参数都通过这个获取，像识别目前手机是注册的是移动还是联通等信息网络上传的比较多的也是通过该方法，特别是啸天兄在</span><span lang=EN-US>nokia</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">论坛分享了代码之后，网络上大多采用其代码，当然也包括我这样的懒人在内，而且往往很多人都没有注意最关键的原理即&#8220;<span style="COLOR: red">国际移动用户识别码（</span></span><span style="COLOR: red" lang=EN-US>IMSI</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span style="COLOR: red" lang=EN-US>International Mobile Subscriber Identification Number</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）是区别移动用户的标志，储存在</span><span style="COLOR: red" lang=EN-US>SIM</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">卡中，可用于区别移动用户的有效信息。</span><span style="COLOR: red" lang=EN-US>IMSI</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由</span><span style="COLOR: red" lang=EN-US>MCC</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span style="COLOR: red" lang=EN-US>MNC</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span style="COLOR: red" lang=EN-US>MSIN</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组成，其中</span><span style="COLOR: red" lang=EN-US>MCC</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为移动国家号码，由</span><span style="COLOR: red" lang=EN-US>3</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位数字组成，唯一地识别移动客户所属的国家，我国为</span><span style="COLOR: red" lang=EN-US>460</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；</span><span style="COLOR: red" lang=EN-US>MNC</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为网络</span><span style="COLOR: red" lang=EN-US>id</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，由</span><span style="COLOR: red" lang=EN-US>2</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位数字组成，用于识别移动客户所归属的移动网络，中国移动为</span><span style="COLOR: red" lang=EN-US>00</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，中国联通为</span><span style="COLOR: red" lang=EN-US>01</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；</span><span style="COLOR: red" lang=EN-US>MSIN</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为移动客户识别码，采用等长</span><span style="COLOR: red" lang=EN-US>11</span><span style="FONT-FAMILY: 宋体; COLOR: red; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位数字构成&#8221;</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。具体详见</span><span lang=EN-US><a href="http://wiki.forum.nokia.com/index.php/%E5%8C%BA%E5%88%86%E5%BD%93%E5%89%8D%E7%94%A8%E6%88%B7SIM%E5%8D%A1%E6%98%AF%E7%A7%BB%E5%8A%A8%E8%BF%98%E6%98%AF%E8%81%94%E9%80%9A"><u><font color=#800080>http://wiki.forum.nokia.com/index.php/%E5%8C%BA%E5%88%86%E5%BD%93%E5%89%8D%E7%94%A8%E6%88%B7SIM%E5%8D%A1%E6%98%AF%E7%A7%BB%E5%8A%A8%E8%BF%98%E6%98%AF%E8%81%94%E9%80%9A</font></u></a></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最近在使用该代码时，发现假如当手机处于离线状态下，则不论有无插</span><span lang=EN-US>SIM</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">卡，使用啸天兄的方法，就识别不出来了，这个应该跟</span><span lang=EN-US>CTelephony</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实现有关，本人试着通过其源码去了解了，但是貌似跟踪到底层没有完全公开，或者说个人看源码能力还太弱了些。由于采用啸天兄方法实现不了了，所以只能从上面的红头文件（即红体字）寻找解决方法，虽然</span><span lang=EN-US>CTelephony::GetCurrentNetworkInfo</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在离线模式下失效，但是</span><span lang=EN-US>CTelephony::GetSubscriberId</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">仍然可用，为此我们就可以通过直接分析</span><span lang=EN-US>IMSI</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来实现对运营商网络的识别，至于</span><span lang=EN-US>MNC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的信息，大家可以查询</span><span lang=EN-US><a href="http://en.wikipedia.org/wiki/Mobile_network_code"><u><font color=#800080>http://en.wikipedia.org/wiki/Mobile_network_code</font></u></a></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，在国内的情况如下截图：</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/franksunny/Symbian技术图/MCN.JPG" width=523 height=356></o:lock></v:shapetype></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">既然知道了如上信息，我们就可以简单的对</span><span lang=EN-US>IMSI</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">号进行分析了，小可对啸天兄的代码进行简单修改，当然该代码也是使用</span><span lang=EN-US>CTelephony</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，只能使用在</span><span lang=EN-US>EKA2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">平台上，</span><span lang=EN-US>EKA1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以采用</span><span lang=EN-US>RMobilePhone::GetSubscriberId</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方法来获取</span><span lang=EN-US>IMSI</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，在这里也就不做展开了，具体代码如下：</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">头文件</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>/*</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;</span>* TelephonyAO.h</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;</span>*</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;</span>*<span style="mso-spacerun: yes">&nbsp; </span>Created on: <st1:chsdate w:st="on" Year="2010" Month="4" Day="22" IsLunarDate="False" IsROCDate="False">2010-4-22</st1:chsdate></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;</span>*<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Author: frank</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;</span>*/</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>#ifndef TELEPHONYAO_H_</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>#define TELEPHONYAO_H_</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>#include &lt;e32base.h&gt;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>#include &lt;Etel3rdParty.h&gt;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span style="COLOR: red" lang=EN-US>typedef enum <o:p></o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span style="COLOR: red" lang=EN-US>{<o:p></o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span style="COLOR: red" lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ENetWorkUnKnow,<o:p></o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span style="COLOR: red" lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ENetWorkCM,<o:p></o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span style="COLOR: red" lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ENetWorkUN,<o:p></o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span style="COLOR: red" lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ENetWorkTC,<o:p></o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span style="COLOR: red" lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ENetWorkTT,<o:p></o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span style="COLOR: red" lang=EN-US>}TNetWorkType;<o:p></o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>class CTelephonyAO : public CActive</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>public:</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>static CTelephonyAO* NewL();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TNetWorkType GetNetWorkId();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>public:</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>~CTelephonyAO();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>protected:</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>void DoCancel();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>void RunL();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>private:</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CTelephonyAO();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>void ConstructL();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>void GetNetWorkInfo();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>private:</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CActiveSchedulerWait*<span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>iActiveSchedulerWait;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CTelephony*<span style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pTelephony_;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span style="COLOR: red" lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CTelephony::TSubscriberIdV1<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>iSubscribId;<o:p></o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span style="COLOR: red" lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CTelephony::TSubscriberIdV1Pckg <span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>iSubscriberIdPckg;<o:p></o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>};</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>#endif /* TELEPHONYAO_H_ */</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现文件</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>/*</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;</span>* TelephonyAO.cpp</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;</span>*</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;</span>*<span style="mso-spacerun: yes">&nbsp; </span>Created on: <st1:chsdate w:st="on" Year="2010" Month="4" Day="22" IsLunarDate="False" IsROCDate="False">2010-4-22</st1:chsdate></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;</span>*<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Author: frank</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;</span>*/</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>#include "TelephonyAO.h"</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>CTelephonyAO::CTelephonyAO() : CActive(EPriorityStandard), iSubscriberIdPckg(iSubscribId)</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>CTelephonyAO::~CTelephonyAO()</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>delete pTelephony_;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pTelephony_ = NULL;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>delete iActiveSchedulerWait;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>iActiveSchedulerWait = NULL;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>void CTelephonyAO::ConstructL()</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pTelephony_ = CTelephony::NewL();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>iActiveSchedulerWait = new (ELeave)CActiveSchedulerWait;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CActiveScheduler::Add(this);</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>CTelephonyAO* CTelephonyAO::NewL()</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CTelephonyAO* pSelf = new(ELeave) CTelephonyAO;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CleanupStack::PushL(pSelf);</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>pSelf-&gt;ConstructL();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CleanupStack::Pop();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return pSelf;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>void CTelephonyAO::RunL()</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (iActiveSchedulerWait-&gt;IsStarted()) </span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ </span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>iActiveSchedulerWait-&gt;AsyncStop(); </span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>void CTelephonyAO::DoCancel()</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: red">pTelephony_-&gt;CancelAsync(CTelephony::EGetSubscriberIdCancel);<o:p></o:p></span></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (iActiveSchedulerWait-&gt;IsStarted()) </span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ </span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>iActiveSchedulerWait-&gt;AsyncStop(); </span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>void CTelephonyAO::GetNetWorkInfo()</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Cancel();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: red">pTelephony_-&gt;GetSubscriberId(iStatus, iSubscriberIdPckg);<o:p></o:p></span></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SetActive();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>iActiveSchedulerWait-&gt;Start();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>TNetWorkType CTelephonyAO::GetNetWorkId()</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>GetNetWorkInfo();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TNetWorkType vNetWorkType = ENetWorkUnKnow;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(iSubscribId.iSubscriberId.Length() &lt; 15)</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vNetWorkType = ENetWorkUnKnow;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TBuf&lt;6&gt; vHeader;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vHeader.Copy(iSubscribId.iSubscriberId.Left(5));</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TBuf&lt;3&gt; vPtrTemp;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vPtrTemp.Copy(vHeader.Right(2));</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TInt vNetWorkId = 0;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TLex vLex(vPtrTemp);</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vLex.Val(vNetWorkId);</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if((vNetWorkId == 1) ||(vNetWorkId == 6))</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vNetWorkType = ENetWorkUN;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else if((vNetWorkId == 0) ||(vNetWorkId == 2))</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vNetWorkType = ENetWorkCM;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else if((vNetWorkId == 3) ||(vNetWorkId == 5))</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vNetWorkType = ENetWorkTC;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else if(vNetWorkId == 20)</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vNetWorkType = ENetWorkTT;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>else</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>vNetWorkType = ENetWorkUnKnow;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return vNetWorkType;</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US>}</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">至于如何调用，就可以通过如下简单获取了，不用再自己去比较了。</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #d9d9d9; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CTelephonyAO* pTelephony = CTelephonyAO::NewL();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #d9d9d9; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CleanupStack::PushL(pTelephony);</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #d9d9d9; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>TNetWorkType vNetWorkType = pTelephony-&gt;GetNetWorkId();</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #d9d9d9; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>CleanupStack::PopAndDestroy(pTelephony);</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">好了，暂时小结如下吧，感谢啸天兄前人植树。</span></p>
<img src ="http://www.cppblog.com/franksunny/aggbug/113265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2010-04-22 19:13 <a href="http://www.cppblog.com/franksunny/archive/2010/04/22/113265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转加整理]Symbian下用C++实现网页浏览的代码 </title><link>http://www.cppblog.com/franksunny/archive/2009/08/12/93044.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Wed, 12 Aug 2009 09:36:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2009/08/12/93044.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/93044.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2009/08/12/93044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/93044.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/93044.html</trackback:ping><description><![CDATA[<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: ˎ̥; mso-bidi-font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">先声明一下，下面的这段代码是调用系统的浏览器实现网页浏览的功能，很显然这是一种比较简单的方法，但是它的可控制性就不行了，例如左软键的内容你是肯定该不了的。如何写一个自己的浏览器，而不调用系统的，等以后做出来再说吧。</span><span style="mso-bidi-font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: ˎ̥; mso-bidi-font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">调用系统的浏览器来实现网页浏览可以根据系统浏览器的状态而决定调用的方法，例如当系统浏览器正在使用的时候可以用</span><span style="mso-bidi-font-size: 9.0pt; mso-bidi-font-family: 'Courier New'; mso-font-kerning: 0pt" lang=EN-US>T</span><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>ApaTask::SendMessage ()</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: ˎ̥; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">方法；当系统浏览器没有被使用的时候可以用</span><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>RapaLsSession::StartDocument() </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: ˎ̥; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">方法。</span><span style="mso-hansi-font-family: ˎ̥; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: ˎ̥; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">下面是实现代码：</span><span style="mso-hansi-font-family: ˎ̥; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>TBool CinternetAppUi::ConnectL(const TDesC&amp; addr)<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>{<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;const TInt KBrowserUid = 0x10008D39;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;TUid id( TUid::Uid( KBrowserUid ) );<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;TApaTaskList taskList( CEikonEnv::Static()-&gt;WsSession() );<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;TApaTask task = taskList.FindApp( id );<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;// the system browser is in use<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;if ( task.Exists() )<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;&nbsp;&nbsp; {<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;&nbsp;&nbsp; HBufC8* param8 = HBufC8::NewLC( addr.Length() );<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;&nbsp;&nbsp; param8-&gt;Des().Append( addr );<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;&nbsp;&nbsp; task.SendMessage( TUid::Uid( 0 ), *param8 ); // Uid is not used<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;&nbsp;&nbsp; CleanupStack::PopAndDestroy();<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;// the system browser is not in use<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>else<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;{<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;&nbsp;RApaLsSession&nbsp;&nbsp; appArcSession;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;&nbsp;User::LeaveIfError(appArcSession.Connect());&nbsp;&nbsp;&nbsp; // connect to AppArc server<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;&nbsp;TThreadId id;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;&nbsp;appArcSession.StartDocument( addr, TUid::Uid( KBrowserUid ), id );<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;&nbsp;appArcSession.Close();<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;}<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&nbsp;return ETrue;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0; mso-pagination: widow-orphan" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>}</span><span style="mso-bidi-font-size: 9.0pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US><o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>//</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: ˎ̥; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">其中入口参数</span><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>addr</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: ˎ̥; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">的格式是</span><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&#8220;<st1:chmetcnv w:st="on" UnitName="&#8221;" SourceValue="4" HasSpace="False" Negative="False" NumberType="1" TCSC="0">4&#8221;</st1:chmetcnv>+&#8221; &lt;Space&gt;&#8220;+&#8221;&lt;Url&gt;&#8221;</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: ˎ̥; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">，例如</span><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>&#8220;4&nbsp; <a href="http://www.google.com/" target=_blank><span style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none">www.google.com</span></a>&#8221;</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: ˎ̥; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">。</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其中采用以上方法不仅仅可以用于开启网页，还可以用于启动安装</span><span lang=EN-US>sis/sisx</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，具体示例代码如下：</span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="mso-font-kerning: 0pt" lang=EN-US>RApaLsSession installSession;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="mso-font-kerning: 0pt" lang=EN-US>TThreadId threadId;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="mso-font-kerning: 0pt" lang=EN-US>TUid uid;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="mso-font-kerning: 0pt" lang=EN-US>uid.iUid = 0x<st1:chmetcnv w:st="on" UnitName="F" SourceValue="101" HasSpace="False" Negative="False" NumberType="1" TCSC="0">101F</st1:chmetcnv><st1:chmetcnv w:st="on" UnitName="a" SourceValue="875" HasSpace="False" Negative="False" NumberType="1" TCSC="0">875A</st1:chmetcnv>;<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="mso-font-kerning: 0pt" lang=EN-US>installSession.Connect();<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="mso-font-kerning: 0pt" lang=EN-US>installSession.StartDocument(aFileName, uid, threadId);<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="mso-font-kerning: 0pt" lang=EN-US>installSession.Close();<o:p></o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">该代码自己没有亲测过，但是从理论上说应该可行，而且有大牛说</span><span lang=EN-US>uid</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都不用传进去。</span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另外播放音乐文件，网上也说可以通过该方法来实现，</span><span lang=EN-US>Uid</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分别如下：</span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="mso-font-kerning: 0pt" lang=EN-US>0x<st1:chmetcnv w:st="on" UnitName="C" SourceValue="102072" HasSpace="False" Negative="False" NumberType="1" TCSC="0">102072c</st1:chmetcnv>3 (from S60 3rd Edition onwards)<o:p></o:p></span></p>
<p style="TEXT-ALIGN: left; TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; BACKGROUND: #e0e0e0; mso-char-indent-count: 2.0" class=MsoNormal align=left><span style="mso-font-kerning: 0pt" lang=EN-US>0x<st1:chmetcnv w:st="on" UnitName="C" SourceValue="6" HasSpace="False" Negative="False" NumberType="1" TCSC="0">6c</st1:chmetcnv>5b9d2 (S60 2nd Edition)<o:p></o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span style="mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang=EN-US>RapaLsSession::StartDocument()</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">功能还是很强大的，在这里只做摘录，以后有机会再亲测，不过用其打开网页的确可行。<br><br></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="TEXT-INDENT: 21pt; MARGIN: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p style="MARGIN: 0cm 0cm 0pt" class=MsoNormal><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/franksunny/aggbug/93044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2009-08-12 17:36 <a href="http://www.cppblog.com/franksunny/archive/2009/08/12/93044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[整理]虚拟继承入门</title><link>http://www.cppblog.com/franksunny/archive/2008/10/16/64168.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Thu, 16 Oct 2008 08:55:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2008/10/16/64168.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/64168.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2008/10/16/64168.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/64168.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/64168.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这次失业之后，突然发现现在工作好像真的不是很好找，没办法，主动权不在自己手里，静下心来想想就当通过笔试来给自己查漏补缺吧，昨天笔试遇到一个虚拟继承的概念，这不虽说</span><span lang=EN-US>2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分的题，但是这个玩意有大内容，我学习了下，也就先整个入门出来吧：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为什么要引入虚拟继承？</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">虚拟继承在一般的应用中很少用到，所以也往往被忽视，这也主要是因为在</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">中，多重继承是不推荐的，也并不常用，而一旦离开了多重继承，虚拟继承就完全失去了存在的必要（因为这样只会降低效率和占用更多的空间，关于这一点，我自己还没有太多深刻的理解，有兴趣的可以看网络上白杨的作品</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><a href="http://baiy.cn/doc/cpp/RTTI%E3%80%81%E8%99%9A%E5%87%BD%E6%95%B0%E5%92%8C%E8%99%9A%E5%9F%BA%E7%B1%BB%E7%9A%84%E5%BC%80%E9%94%80%E5%88%86%E6%9E%90%E5%92%8C%E4%BD%BF%E7%94%A8%E6%8C%87%E5%AF%BC.htm"><u><font color=#800080><span lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span lang=EN-US>《</span></span>RTTI<span lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span lang=EN-US>、虚函数和虚<span lang=EN-US>基<span lang=EN-US>类的开销分析及使用指导<span lang=EN-US>》</span></span></span></span></span></font></u></a></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，说实话我目前还没看得很明白，高人可以指点下我）。</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">以下面的一个例子为例：</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">#include &lt;iostream.h&gt;<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">#include &lt;memory.h&gt;<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">class CA<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="COLOR: red">int k; //</span></span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">如果基类没有数据成员，则在这里多重继承编译不会出现二义性</span><span lang=EN-US style="COLOR: red; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">public:<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>void f() {cout &lt;&lt; "CA::f" &lt;&lt; endl;}<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">};<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">class CB : public CA<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">};<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">class CC : public CA<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">};<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">class CD : public CB, public CC<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">};<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">void main()<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>CD d;<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>d.f();<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">当编译上述代码时，我们会收到如下的错误提示：</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: red; mso-bidi-font-size: 10.5pt">error C2385: 'CD::f' is ambiguous<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">即编译器无法确定你在</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">d.f()</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">中要调用的函数</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">f</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">到底是哪一个。这里可能会让人觉得有些奇怪，命名只定义了一个</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CA::f</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，既然大家都派生自</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CA</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，那自然就是调用的</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CA::f</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，为什么还无法确定呢？</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">这是因为<span style="COLOR: red">编译器在进行编译的时候，需要确定子类的函数定义</span>，如</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CA::f</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">是确定的，那么在编译</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">、</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">时还需要在编译器的语法树中生成</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CB::f</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CC::f</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">等标识，那么，在编译</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CD</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的时候，由于</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">、</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">都有一个函数</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">f</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，此时，编译器将试图生成这两个</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CD::f</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">标识，显然这时就要报错了。（<span style="COLOR: red">当我们不使用</span></span><span lang=EN-US style="COLOR: red; mso-bidi-font-size: 10.5pt">CD::f</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的时候，以上标识都不会生成，所以，如果去掉</span><span lang=EN-US style="COLOR: red; mso-bidi-font-size: 10.5pt">d.f()</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">一句，程序将顺利通过编译</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">）</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">要解决这个问题，有两个方法：</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">1</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">、重载函数</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">f()</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">：此时由于我们明确定义了</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CD::f</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，编译器检查到</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CD::f()</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">调用时就无需再像上面一样去逐级生成</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CD::f</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">标识了；</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<div style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-element: para-border-div; mso-border-bottom-alt: solid windowtext .75pt">
<p class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; MARGIN: 0cm 0cm 0pt; BORDER-LEFT: medium none; TEXT-INDENT: 21pt; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none; mso-char-indent-count: 2.0; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">此时</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CD</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的元素结构如下：</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
</div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">|CB(CA)|<o:p></o:p></span></p>
<div style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-element: para-border-div; mso-border-bottom-alt: solid windowtext .75pt">
<p class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; MARGIN: 0cm 0cm 0pt; BORDER-LEFT: medium none; TEXT-INDENT: 21pt; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none; mso-char-indent-count: 2.0; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">|CC(CA)|<o:p></o:p></span></p>
</div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">故此时的</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">sizeof(CD) = 8;</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">（</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">、</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">各有一个元素</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">k</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">）</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">2</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">、使用虚拟继承：虚拟继承又称作共享继承，这种共享其实也是编译期间实现的，当使用虚拟继承时，上面的程序将变成下面的形式：</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">#include &lt;iostream.h&gt;<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">#include &lt;memory.h&gt;<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">class CA<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>int k;<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">public:<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>void f() {cout &lt;&lt; "CA::f" &lt;&lt; endl;}<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">};<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: red; mso-bidi-font-size: 10.5pt">class CB : virtual public CA<span style="mso-spacerun: yes">&nbsp; </span></span><span lang=EN-US style="COLOR: #339966; mso-bidi-font-size: 10.5pt">//</span><span style="COLOR: #339966; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">也有一种写法是</span><span lang=EN-US style="COLOR: #339966; mso-bidi-font-size: 10.5pt">class CB : public virtual CA</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">{<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #339966">//</span></span><span style="COLOR: #339966; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">实际上这两种方法都可以</span><span lang=EN-US style="COLOR: #339966; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">};<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: red; mso-bidi-font-size: 10.5pt">class CC : virtual public CA<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">};<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">class CD : public CB, public CC<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">};<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">void main()<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>CD d;<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>d.f();<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">}<o:p></o:p></span></p>
<div style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-element: para-border-div; mso-border-bottom-alt: solid windowtext .75pt">
<p class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; MARGIN: 0cm 0cm 0pt; BORDER-LEFT: medium none; TEXT-INDENT: 21pt; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none; mso-char-indent-count: 2.0; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">此时，当编译器确定</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">d.f()</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">调用的具体含义时，将生成如下的</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CD</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">结构：</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
</div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">|CB|<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">|CC|<o:p></o:p></span></p>
<div style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-element: para-border-div; mso-border-bottom-alt: solid windowtext .75pt">
<p class=MsoNormal style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0cm; BORDER-TOP: medium none; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; MARGIN: 0cm 0cm 0pt; BORDER-LEFT: medium none; TEXT-INDENT: 21pt; PADDING-TOP: 0cm; BORDER-BOTTOM: medium none; mso-char-indent-count: 2.0; mso-border-bottom-alt: solid windowtext .75pt; mso-padding-alt: 0cm 0cm 1.0pt 0cm"><span lang=EN-US style="mso-bidi-font-size: 10.5pt">|CA|<o:p></o:p></span></p>
</div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">同时，在</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">、</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">中都分别包含了一个指向</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CA</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的虚基类指针列表</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">vbptr</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">（</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">virtual base table pointer</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">），其中记录的是从</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">、</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的元素到</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CA</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">的元素之间的偏移量。此时，不会生成各子类的函数</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">f</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">标识，除非子类重载了该函数，从而达到&#8220;共享&#8221;的目的（这里的具体内存布局，可以参看钻石型继承内存布局，在白杨的那篇文章中也有）。</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">也正因此，此时的</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">sizeof(CD) = 12</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">（两个</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">vbptr + sizoef(int)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">）</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">另注：</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">如果</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CB</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CC</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">中各定义一个</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">int</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">型变量，则</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">sizeof(CD)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">就变成</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">20(</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">两个</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">vbptr + 3</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">个</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">sizoef(int)<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">如果</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">CA</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">中添加一个</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">virtual void f1(){}</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">sizeof(CD) = 16</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">（两个</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">vbptr + sizoef(int)+vptr</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">）</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">再添加</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">virtual void f2(){}</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">，</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">sizeof(CD) = 16</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">不变。原因如下所示：带有虚函数的类，其内存布局上包含一个指向虚函数列表的指针（</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt">vptr</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">），这跟有几个虚函数无关。</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">以上内容涉及到类对象内存布局问题，本人还难以做过多展开，先贴这么多，本篇文章只是考虑对于虚拟继承进行入门，至于效率、应用等未作展开。本文在网上文章基础上修改了下而得此篇，原文载于</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><a href="http://blog.csdn.net/billdavid/archive/2004/06/23/24317.aspx"><u><font color=#800080>http://blog.csdn.net/billdavid/archive/2004/06/23/24317.aspx</font></u></a><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">另外关于虚继承和虚基类的讨论，博客园有篇文章《</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><a href="http://www.cppblog.com/chemz/archive/2007/06/12/26135.html"><span lang=EN-US style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span lang=EN-US><u><font color=#800080>虚继承与虚基类的本质</font></u></span></span></a></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">》，总结得更为详细一点。</span><span lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p><span></span>&nbsp;</p>
<img src ="http://www.cppblog.com/franksunny/aggbug/64168.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2008-10-16 16:55 <a href="http://www.cppblog.com/franksunny/archive/2008/10/16/64168.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在C++中调用C的代码</title><link>http://www.cppblog.com/franksunny/archive/2008/10/10/63675.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Fri, 10 Oct 2008 09:54:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2008/10/10/63675.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/63675.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2008/10/10/63675.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/63675.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/63675.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如何在</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中调用</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的代码</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以前曾经总结过一篇(<a href="http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html">http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html</a>)，关于在</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中如何调用</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的代码，当时并未做完全的展开，只是简单的做了下调试，最近看到一个题目要求实现</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中代码的互相调用，其结果虽然都是<span style="COLOR: red">通过</span></span><span lang=EN-US style="COLOR: red">extern &#8220;C&#8221;</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来实现</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，但是具体还是有些差别的。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">先对</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中调用</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码作个简单回顾：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 57.75pt; TEXT-INDENT: -36.75pt; mso-list: l0 level1 lfo1; tab-stops: list 57.75pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">1、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对于</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中非类的成员函数，可以简单的在<span style="COLOR: red">函数声明前面加</span></span><span lang=EN-US style="COLOR: red">extern &#8220;C&#8221;</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，通常函数声明位于头文件中，当然也可以<span style="COLOR: red">将声明和函数定义一起放在</span></span><span lang=EN-US style="COLOR: red">cpp</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，在<span style="COLOR: red">没有声明的情况下，直接在定义前添加</span></span><span lang=EN-US style="COLOR: red">extern &#8220;C&#8221;</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也可</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 57.75pt; TEXT-INDENT: -36.75pt; mso-list: l0 level1 lfo1; tab-stops: list 57.75pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">2、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对于</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的成员函数，则<span style="COLOR: red">需要另外做一个</span></span><span lang=EN-US style="COLOR: red">cpp</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件，将需要调用的函数进行包装</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以上两项的实例参看前面</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中如何调用</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码的文章。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要实现</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中调用</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的代码，具体操作：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对于</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的函数代码，要么<span style="COLOR: red">将</span></span><span lang=EN-US style="COLOR: red">C</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码的头文件进行修改，在其被含入</span><span lang=EN-US style="COLOR: red">C++</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码时在声明中加入</span><span lang=EN-US style="COLOR: red">extern &#8220;C&#8221;</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者<span style="COLOR: red">在</span></span><span lang=EN-US style="COLOR: red">C++</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码中重新声明一下</span><span lang=EN-US style="COLOR: red">C</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数，重新声明时添加上</span><span lang=EN-US style="COLOR: red">extern &#8220;C&#8221;</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">头</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过以上的说明，我明白一点，那就是<span style="COLOR: red">加</span></span><span lang=EN-US style="COLOR: red">extern &#8220;C&#8221;</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">头一定是加在</span><span lang=EN-US style="COLOR: red">C++</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的代码文件中才能起作用的</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面分析一下这个现象的实质原因：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译器编译函数时不带函数的类型信息，只包含函数符号名字，如</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译器把函数</span><span lang=EN-US>int a(float x)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译成类似</span><span lang=EN-US>_a</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样的符号，</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">连接器只要找到了调用函数的符号，就可以连接成功，它假设参数类型信息是正确的，这是</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译连接器的缺点。而</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译器为了实现函数重载，编译时会带上函数的类型信息，如他把上面的</span><span lang=EN-US>a</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数可能编译成</span><span lang=EN-US>_a_float</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样的符号为了实现重载，注意它还是没有带返回值得信息，这也是为什么</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不支持采用函数返回值来区别函数重载的原因之一，当然，函数的使用者对函数返回值的处理方式（如忽略）也是重要原因。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">基于以上，</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调用</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，首先需要用封装函数把对</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的类等的调用封装成</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数以便</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调用，于是</span><span lang=EN-US>extern "C"</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的作用是：让编译器知道这件事，然后<span style="COLOR: red">以</span></span><span lang=EN-US style="COLOR: red">C</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言的方式编译和连接封装函数</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（<span style="COLOR: red">通常是把封装函数用</span></span><span lang=EN-US style="COLOR: red">C++</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译器按</span><span lang=EN-US style="COLOR: red">C++</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方式编译，用了</span><span lang=EN-US style="COLOR: red">extern "C" </span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后，编译器便依</span><span lang=EN-US style="COLOR: red">C</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方式编译封装接口，当然接口函数里面的</span><span lang=EN-US style="COLOR: red">C++</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语法还是按</span><span lang=EN-US style="COLOR: red">C++</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方式编译；对于</span><span lang=EN-US style="COLOR: red">C</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言部分</span><span lang=EN-US style="COLOR: red">--</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调用者，还是按</span><span lang=EN-US style="COLOR: red">C</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语言编译；分别对</span><span lang=EN-US style="COLOR: red">C++</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口部分和</span><span lang=EN-US style="COLOR: red">C</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">部分编译后，再连接就可以实现</span><span lang=EN-US style="COLOR: red">C</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调用</span><span lang=EN-US style="COLOR: red">C++</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">了</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。相反</span><span lang=EN-US>,C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">调用</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数，</span><span lang=EN-US>extern "C" </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的作用是：让</span><span lang=EN-US style="COLOR: red">C++</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">连接器找调用函数的符号时采用</span><span lang=EN-US style="COLOR: red">C</span><span style="COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方式</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，即使用</span><span lang=EN-US>_a</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而不是</span><span lang=EN-US>_a_float</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来找调用函数。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">具体示例请见</span><span lang=EN-US><a href="http://www.cppblog.com/Files/franksunny/CCallCpp.rar"><u><font color=#0000ff>http://www.cppblog.com/Files/franksunny/CCallCpp.rar</font></u></a></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注：如果你用</span><span lang=EN-US>VC6.0</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译附件时遇到类似</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">&#8220;fatal error C1010: unexpected end of file while looking for precompiled header directive&#8221;</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">报错的话，请将</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">bb.c</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">文件做如下处理右键点击项目工程中的该文件，选择</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">setting</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">，在</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">c/c++</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">栏，选择</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial">PreCompiled headers</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">，然后设置第一选项，选择不使用预编译头。</span><span lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Arial"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/franksunny/aggbug/63675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2008-10-10 17:54 <a href="http://www.cppblog.com/franksunny/archive/2008/10/10/63675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++多态的实现（第一次接到面试电话，汗颜一下）</title><link>http://www.cppblog.com/franksunny/archive/2008/05/19/50424.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Mon, 19 May 2008 12:30:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2008/05/19/50424.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/50424.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2008/05/19/50424.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/50424.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/50424.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">今天接到电话面试，被问到几个问题，汗颜之余，小结一下</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">1、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">多态是如何实现绑定的</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">多态的绑定可以分为运行是多态和编译时多态</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译时的多态性</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译时的多态性是通过重载来实现的。对于非虚的成员来说，系统在编译时，根据传递的参数、返回的类型等信息决定实现何种操作。</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">●</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时的多态性</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">运行时的多态性就是指直到系统运行时，才根据实际情况决定实现何种操作。</span><span lang=EN-US>C#</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，运行时的多态性通过虚成员实现。</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译时的多态性为我们提供了运行速度快的特点，而运行时的多态性则带来了高度灵活和抽象的特点。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">今天才正式弄清楚原来虚函数是可以实现运行时多态的，以前只知道虚函数可以使得基类对象的的方法调用派生类的方法。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">2、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">析构函数是虚函数的优点是什么</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开发的时候，用来做基类的类的析构函数一般都是虚函数。可是，为什么要这样做呢？下面用一个小例子来说明：</span> <span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有下面的两个类：</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>class ClxBase<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>{<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>public:<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>ClxBase() {};<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>virtual ~ClxBase() {};<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>virtual void DoSomething() { cout &lt;&lt; "Do something in class ClxBase!" &lt;&lt; endl; };<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>};<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>class ClxDerived : public ClxBase<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>{<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>public:<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>ClxDerived() {};<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>~ClxDerived() { cout &lt;&lt; "Output from the destructor of class ClxDerived!" &lt;&lt; endl; }; <o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>void DoSomething() { cout &lt;&lt; "Do something in class ClxDerived!" &lt;&lt; endl; };<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>};<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>ClxBase *pTest = new ClxDerived;<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>pTest-&gt;DoSomething();<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #e0e0e0; MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>delete pTest;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">输出结果是：</span><span lang=EN-US><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>Do something in class ClxDerived!<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>Output from the destructor of class ClxDerived!<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个很简单，非常好理解。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">但是，如果把类</span><span lang=EN-US>ClxBase</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">析构函数前的</span><span lang=EN-US>virtual</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">去掉，那输出结果就是下面的样子了：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>Do something in class ClxDerived!</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也就是说，类</span><span lang=EN-US>ClxDerived</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的析构函数根本没有被调用！一般情况下类的析构函数里面都是释放内存资源，而析构函数不被调用的话就会造成内存泄漏。我想所有的</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序员都知道这样的危险性。当然，如果在析构函数中做了其他工作的话，那你的所有努力也都是白费力气。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">所以，文章开头的那个问题的答案就是－－这样做是为了当用一个基类的指针删除一个派生类的对象时，派生类的析构函数会被调用。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当然，并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候，编译器会给类添加一个虚函数表，里面来存放虚函数指针，这样就会增加类的存储空间。所以，只有当一个类被用来作为基类的时候，才把析构函数写成虚函数。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">说实话，这个也是今天才深刻认识到的。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当然还问到很多数据结构和算法方面（空间复杂度和时间复杂度之类的东东，说真的也是基础性的）的问题，至于那些东西，自己说实话抛开没用他们已经很长时间了，真可以说忘的差不多了，考这种真的很怕，也怪平时没怎么用到。不知道大家用的多不？</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">好久没有正式参加过面试了，今天突然来一次觉得自己基础还是不够扎实。</span></p>
<img src ="http://www.cppblog.com/franksunny/aggbug/50424.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2008-05-19 20:30 <a href="http://www.cppblog.com/franksunny/archive/2008/05/19/50424.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C中如何调用C++函数</title><link>http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Thu, 29 Nov 2007 12:38:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/37510.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/37510.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/37510.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中如何调用</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数</span><span lang=EN-US>?</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">前阵子被问及一个在</span><span lang=EN-US>C</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中如何调用</span><span lang=EN-US>C++</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数的问题</span><span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">，当时简单回答是<span style="COLOR: black">将函数</span>用<span lang=EN-US style="COLOR: black">extern "C"</span><span style="COLOR: black">声明，当被问及如何将类内成员函数声明时，一时语塞，后来网上查了下，网上有一翻译<span lang=EN-US>C++</span>之父的文章可以作为解答，遂拿来<span lang=EN-US>Mark</span>一下。<span lang=EN-US><o:p></o:p></span></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将</span><span lang=EN-US> C++ </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数声明为</span><span lang=EN-US>``extern "C"''</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（在你的</span><span lang=EN-US> C++ </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码里做这个声明），然后调用它（在你的</span><span lang=EN-US> C </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者</span><span lang=EN-US> C++ </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码里调用）。例如：</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>// C++ code:</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>extern "C" void f(int); </span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>void f(int i)</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>{</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>// ...</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>} </span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后，你可以这样使用</span><span lang=EN-US> f()</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span lang=EN-US> </span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=DE style="mso-ansi-language: DE">/* C code: */<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>void f(int); </span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>void cc(int i)</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>{</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>f(i);</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 26.25pt; mso-char-indent-count: 2.5"><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>/* ... */</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;</span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>}</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当然，这招只适用于非成员函数。如果你想要在</span><span lang=EN-US> C </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里调用成员函数（包括虚函数），则需要提供一个简单的包装（</span><span lang=EN-US>wrapper</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）。例如：</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>// C++ code:</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>class C</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>{</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// ...</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>virtual double f(int);</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>}; </span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>extern "C" double call_C_f(C* p, int i) // wrapper function</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>{</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return p-&gt;f(i);</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>}</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后，你就可以这样调用</span><span lang=EN-US> C::f()</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span lang=EN-US> </span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>/* C code: */</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>double call_C_f(struct C* p, int i); </span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>void ccc(struct C* p, int i)</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>{</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>double d = call_C_f(p,i);</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>/* ... */</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>} </span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果你想在</span><span lang=EN-US> C </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里调用重载函数，则必须提供不同名字的包装，这样才能被</span><span lang=EN-US> C </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码调用。例如</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-ansi-language: DE">：</span><span lang=DE style="mso-ansi-language: DE"><o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=DE style="mso-ansi-language: DE">// C++ code:<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=DE style="mso-ansi-language: DE">void f(int);<o:p></o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>void f(double); </span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>extern "C" void f_i(int i) { f(i); }</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>extern "C" void f_d(double d) { f(d); } </span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后，你可以这样使用每个重载的</span><span lang=EN-US> f()</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span lang=EN-US> </span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>/* C code: */</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>void f_i(int);</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>void f_d(double); </span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>void cccc(int i,double d)</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>{</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>f_i(i);</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>f_d(d);</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>/* ... */</span></p>
<p class=MsoNormal style="BACKGROUND: #d9d9d9; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US>} </span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意，这些技巧也适用于在</span><span lang=EN-US> C </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里调用</span><span lang=EN-US> C++ </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类库，即使你不能（或者不想）修改</span><span lang=EN-US> C++ </span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">头文件。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">该翻译的文档</span><span lang=EN-US>Bjarne Stroustrup</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的原文链接地址是</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><a href="http://www.research.att.com/~bs/bs_faq2.html#callCpp"><u><font color=#800080>http://www.research.att.com/~bs/bs_faq2.html#callCpp</font></u></a><br><br></span>本来贴出来以后受到很多C/C++朋友的关注，非常荣幸，在&#8220;梦在天涯&#8221;的提醒下，本人后来又完成了一个Demo工程，发现和BJ说的有点出入，希望有高手指点，Demo工程下载链接如下：</o:p></span><a href="http://www.cppblog.com/Files/franksunny/cCallCppDemo.rar">http://www.cppblog.com/Files/franksunny/cCallCppDemo.rar</a><br><br></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><a href="http://www.research.att.com/~bs/bs_faq2.html#callCpp"><u><font color=#800080></font></u></a></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cppblog.com/franksunny/aggbug/37510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2007-11-29 20:38 <a href="http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无符号变量居然也能输出-1</title><link>http://www.cppblog.com/franksunny/archive/2007/10/17/34495.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Wed, 17 Oct 2007 14:46:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2007/10/17/34495.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/34495.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2007/10/17/34495.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/34495.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/34495.html</trackback:ping><description><![CDATA[<p>今天一个很偶然的机会，需要回答一个将无符号数据存到有符号变量的问题。我编码如下，结果很有意思，我是在VC6里调试的，有高人看到可否帮忙指点下。<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned short temp1 = 65535;<br>&nbsp;&nbsp;&nbsp;&nbsp;short temp2 = temp1;<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned short temp3 = (unsigned short)temp2;<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned short temp4 = temp2;<br>&nbsp;&nbsp;&nbsp;&nbsp;int temp5 = temp2;<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned int temp6 = temp2;<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned long temp7 = temp2;<br>&nbsp;&nbsp;&nbsp;&nbsp;int temp8 = (unsigned short)temp2;<br>&nbsp;&nbsp;&nbsp;&nbsp;short temp9 = temp2;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf("temp1 = %d\n temp2 = %d\n temp3 = %d\n temp4 = %d\n temp5 = %d\n temp6 = %d\n temp7 = %d\n temp8 = %d\n temp9 = %d\n",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp1,temp2,temp3,temp4, temp5,temp6,temp7,temp8,temp9);<br>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}<br>//改程序的输出结果<br>//temp1 = 65535<br>//temp2 = -1<br>//temp3 = 65535<br>//temp4 = 65535<br>//temp5 = -1<br>//temp6 = -1<br>//temp7 = -1<br>//temp8 = 65535<br>//temp9 = -1;</p>
<p><br>//根据结果也就是说，无符号符号数据是可以存储在有符号型变量内存中的,<br>//而且有例子在内存块长度一样时，不用强转，直接赋给无符号变量时也可行<br>//上述事实可以解释为内存块不变，采用不同的解码方式解出不同的数据<br>//但是读出来的时候要注意，如果有符号转无符号一定要强转<br>//之所以上例unsigned int输出-1，我并不是很清楚</p>
<img src ="http://www.cppblog.com/franksunny/aggbug/34495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2007-10-17 22:46 <a href="http://www.cppblog.com/franksunny/archive/2007/10/17/34495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++的static关键字(转载)</title><link>http://www.cppblog.com/franksunny/archive/2007/10/16/34373.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Tue, 16 Oct 2007 13:03:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2007/10/16/34373.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/34373.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2007/10/16/34373.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/34373.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/34373.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 昨天遇到类内静态函数，本想自己整理下，谁知道已经有人整理的很好了，为此就不麻烦了，看了一篇就转贴在自己空间里，以便以后查询。C++的static关键字作者：韩耀旭C++的static有两种用法：面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数，不涉及类；后者主要说明static在类中的作用。一、面向过程设计中的static1、静态全局变量...&nbsp;&nbsp;<a href='http://www.cppblog.com/franksunny/archive/2007/10/16/34373.html'>阅读全文</a><img src ="http://www.cppblog.com/franksunny/aggbug/34373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2007-10-16 21:03 <a href="http://www.cppblog.com/franksunny/archive/2007/10/16/34373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Visual Assist X AutoText修改</title><link>http://www.cppblog.com/franksunny/archive/2007/09/14/32223.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Fri, 14 Sep 2007 09:27:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2007/09/14/32223.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/32223.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2007/09/14/32223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/32223.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/32223.html</trackback:ping><description><![CDATA[<br>自从开始用VC以后，一直以来都在用Visual Assist，感觉这个工具真的非常好，但是有些自动文档功能就个人觉得并非很适合，不过可能由于自身的E文比较差吧，从来没想过自己如何去修改这个东西。来新单位已经两个礼拜了，马上又要下班了，就冲着这个查了下如何修改AutoText，终于发现了官网上的详细说明，现在粘帖在下面，以备不时之需 <a href="http://www.wholetomato.com/products/features/autotext.asp">http://www.wholetomato.com/products/features/autotext.asp</a><br><br>为了查找方便，自己也将常用的命令粘帖过来<br>
<h4>Code</h4>
Type your expanded code into the Code field. Include reserved strings to expand the date, filename and more. <br><br>
<table class=text cellPadding=4 summary="Special Strings" border=0>
    <tbody>
        <tr align=middle>
            <td></td>
            <td bgColor=#c9e5bf><strong>Reserved String</strong></td>
            <td bgColor=#c9e5bf><strong>Meaning</strong></td>
        </tr>
        <tr align=middle>
            <td bgColor=#dddddd><strong>Date</strong></td>
            <td bgColor=#eeeeee>$DATE$</td>
            <td bgColor=#eeeeee>Year/month/day formatted as %04d/%02d/%02d</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$DAY$</td>
            <td bgColor=#eeeeee>Day of month formatted as %d</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$DAY_02$</td>
            <td bgColor=#eeeeee>Day of month formatted as %02d</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$DAYNAME$</td>
            <td bgColor=#eeeeee>Three-character abbreviation of day</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$DAYLONGNAME$</td>
            <td bgColor=#eeeeee>Full name of day</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$MONTH$</td>
            <td bgColor=#eeeeee>Month formatted as %d</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$MONTH_02$</td>
            <td bgColor=#eeeeee>Month formatted as %02d</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$MONTHNAME$</td>
            <td bgColor=#eeeeee>Three-character abbreviation of month</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$MONTHLONGNAME$</td>
            <td bgColor=#eeeeee>Full name of month</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$YEAR$</td>
            <td bgColor=#eeeeee>Year formatted as %d</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$YEAR_02$</td>
            <td bgColor=#eeeeee>Year formatted as %02d</td>
        </tr>
        <tr align=middle>
            <td bgColor=#dddddd><strong>File</strong></td>
            <td bgColor=#eeeeee>$FILE$</td>
            <td bgColor=#eeeeee>Full filename with path*</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$FILE_UPPER$</td>
            <td bgColor=#eeeeee>Full filename with path in uppercase*</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$FILE_BASE$</td>
            <td bgColor=#eeeeee>Filename without path or extension*</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$FILE_BASE_UPPER$</td>
            <td bgColor=#eeeeee>Filename without path or extension in upper case*</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$FILE_EXT$</td>
            <td bgColor=#eeeeee>Filename extension*</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$FILE_EXT_UPPER$</td>
            <td bgColor=#eeeeee>Filename extension in upper case*</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$FILE_PATH$</td>
            <td bgColor=#eeeeee>Path of file*</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$FILE_PATH_UPPER$</td>
            <td bgColor=#eeeeee>Path of file in upper case*</td>
        </tr>
        <tr align=middle>
            <td bgColor=#dddddd><strong>General</strong></td>
            <td bgColor=#eeeeee>$clipboard$</td>
            <td bgColor=#eeeeee>Current clipboard</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$end$</td>
            <td bgColor=#eeeeee>Position of caret after expansion</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$selected$</td>
            <td bgColor=#eeeeee>Current selection**</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$$</td>
            <td bgColor=#eeeeee>$</td>
        </tr>
        <tr align=middle>
            <td bgColor=#dddddd><strong>GUID</strong></td>
            <td bgColor=#eeeeee>$GUID_DEFINITION$</td>
            <td bgColor=#eeeeee>Generated GUID formatted for use in a definition</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$GUID_STRING$</td>
            <td bgColor=#eeeeee>Generated GUID formatted for use in a string</td>
        </tr>
        <tr align=middle>
            <td bgColor=#ffffff></td>
            <td bgColor=#eeeeee>$GUID_STRUCT$</td>
            <td bgColor=#eeeeee>Generated GUID formatted for use in a struct</td>
        </tr>
        <tr align=middle>
            <td></td>
            <td bgColor=#ffffff colSpan=2>(Note that all instances of GUID reserved words will use a singe generated GUID.)</td>
            <br>
            <tr align=middle>
                <td bgColor=#dddddd><strong>Refactor</strong></td>
                <td bgColor=#eeeeee>$GeneratedPropertyName$</td>
                <td bgColor=#eeeeee>Property name generated during Encapsulate Field</td>
            </tr>
            <tr align=middle>
                <td bgColor=#ffffff></td>
                <td bgColor=#eeeeee>$MethodArg$</td>
                <td bgColor=#eeeeee>One parameter of the method and its type</td>
            </tr>
            <tr align=middle>
                <td bgColor=#ffffff></td>
                <td bgColor=#eeeeee>$MethodArgName$</td>
                <td bgColor=#eeeeee>One parameter of the method</td>
            </tr>
            <tr align=middle>
                <td bgColor=#ffffff></td>
                <td bgColor=#eeeeee>$MethodArgType$</td>
                <td bgColor=#eeeeee>Type of one parameter of the method</td>
            </tr>
            <tr align=middle>
                <td bgColor=#ffffff></td>
                <td bgColor=#eeeeee>$MethodBody$</td>
                <td bgColor=#eeeeee>Body of implementation</td>
            </tr>
            <tr align=middle>
                <td bgColor=#ffffff></td>
                <td bgColor=#eeeeee>$MethodQualifier$
                <td bgColor=#eeeeee>Optional qualifiers of method</td>
            </tr>
            <tr align=middle>
                <td bgColor=#ffffff></td>
                <td bgColor=#eeeeee>$ParameterList$</td>
                <td bgColor=#eeeeee>Parameters separated by commas</td>
            </tr>
            <tr align=middle>
                <td bgColor=#ffffff></td>
                <td bgColor=#eeeeee>$SymbolContext$</td>
                <td bgColor=#eeeeee>Context and name of method</td>
            </tr>
            <tr align=middle>
                <td bgColor=#ffffff></td>
                <td bgColor=#eeeeee>$SymbolName$</td>
                <td bgColor=#eeeeee>Name of method</td>
            </tr>
            <tr align=middle>
                <td bgColor=#ffffff></td>
                <td bgColor=#eeeeee>$SymbolPrivileges$</td>
                <td bgColor=#eeeeee>Access of method</td>
            </tr>
            <tr align=middle>
                <td bgColor=#ffffff></td>
                <td bgColor=#eeeeee>$SymbolStatic$</td>
                <td bgColor=#eeeeee>Keyword static or blank</td>
            </tr>
            <tr align=middle>
                <td bgColor=#ffffff></td>
                <td bgColor=#eeeeee>$SymbolType$</td>
                <td bgColor=#eeeeee>Return type of method</td>
            </tr>
            <tr align=middle>
                <td bgColor=#ffffff></td>
                <td bgColor=#eeeeee>$SymbolVirtual$</td>
                <td bgColor=#eeeeee>Keyword virtual or blank</td>
            </tr>
            <tr align=middle>
                <td bgColor=#dddddd><strong>Time</strong></td>
                <td bgColor=#eeeeee>$HOUR$</td>
                <td bgColor=#eeeeee>Hour formatted as %d</td>
            </tr>
            <tr align=middle>
                <td bgColor=#ffffff></td>
                <td bgColor=#eeeeee>$HOUR_02$</td>
                <td bgColor=#eeeeee>Hour formatted as %02d</td>
            </tr>
            <tr align=middle>
                <td bgColor=#ffffff></td>
                <td bgColor=#eeeeee>$MINUTE$</td>
                <td bgColor=#eeeeee>Minute formatted as %02d</td>
            </tr>
            <tr align=middle>
                <td bgColor=#ffffff></td>
                <td bgColor=#eeeeee>$SECOND$</td>
                <td bgColor=#eeeeee>Second formatted as %02d</td>
            </tr>
        </tbody>
    </table>
    <br>*Reserved strings beginning with $FILE expand using the case of the current file. <br><br>**Lines with whitespace and $selected$ are omitted from expanded code if there is no selection. (This lets you define a single entry to be used with and without a selection.) <br><br>Autotext entries containing $GUID_* are available in IDL files. <br><br>Access the list of reserved strings using the context menu inside the Code field when editing Autotext. <br><br><img height=422 alt=autotextCodeInsertNew.png src="http://www.wholetomato.com/products/features/images/autotext/autotextCodeInsertNew.png" width=477>&nbsp;
<img src ="http://www.cppblog.com/franksunny/aggbug/32223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2007-09-14 17:27 <a href="http://www.cppblog.com/franksunny/archive/2007/09/14/32223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]重入和不可重入函数概念浅析</title><link>http://www.cppblog.com/franksunny/archive/2007/08/03/29269.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Fri, 03 Aug 2007 04:56:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2007/08/03/29269.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/29269.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2007/08/03/29269.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/29269.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/29269.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 16pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可重入函数与不可重入函数</span><span lang=EN-US style="FONT-SIZE: 16pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">主要用于多任务环境中，一个可重入的函数简单来说就是可以被中断的函数，也就是说，可以在这个函数执行的任何时刻中断它，转入<span lang=EN-US>OS</span>调度下去执行另外一段代码，而返回控制时不会出现什么错误；而不可重入的函数由于使用了一些系统资源，比如全局变量区，中断向量表等，所以它如果被中断的话，可能会出现问题，这类函数是不能运行在多任务环境下的。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">也可以这样理解，重入即表示重复进入，首先它意味着这个函数可以被中断，其次意味着它除了使用自己栈上的变量以外不依赖于任何环境（包括<span lang=EN-US>static</span>），这样的函数就是<span lang=EN-US>purecode</span>（纯代码）可重入，可以允许有该函数的多个副本在运行，由于它们使用的是分离的栈，所以不会互相干扰。如果确实需要访问全局变量（包括<span lang=EN-US>static</span>），一定要注意实施互斥手段。可重入函数在并行运行环境中非常重要，但是一般要为访问全局变量付出一些性能代价。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">编写可重入函数时，若使用全局变量，则应通过关中断、信号量（即<span lang=EN-US>P</span>、<span lang=EN-US>V</span>操作）等手段对其加以保护。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;</span></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">说明：若对所使用的全局变量不加以保护，则此函数就不具有可重入性，即当多个进程调用此函数时，很有可能使有关全局变量变为不可知状态。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">示例：假设<span lang=EN-US>Exam</span>是<span lang=EN-US>int</span>型全局变量，函数<span lang=EN-US>Squre_Exam</span>返回<span lang=EN-US>Exam</span>平方值。那么如下函数不具有可重入性。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">unsigned int example( int para ) <o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">&nbsp;&nbsp;&nbsp; unsigned int temp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Exam = para; // </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">（<span lang=EN-US>**</span>）<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; temp = Square_Exam( );<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return temp;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; </span>此函数若被多个进程调用的话，其结果可能是未知的，因为当（<span lang=EN-US>**</span>）语句刚执行完后，另外一个使用本函数的进程可能正好被激活，那么当新激活的进程执行到此函数时，将使<span lang=EN-US>Exam</span>赋与另一个不同的<span lang=EN-US>para</span>值，所以当控制重新回到<span lang=EN-US>&#8220;temp = Square_Exam( )&#8221;</span>后，计算出的<span lang=EN-US>temp</span>很可能不是预想中的结果。此函数应如下改进。<span lang=EN-US><br><br>&nbsp;&nbsp;&nbsp; unsigned int example( int para ) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned int temp;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [</span>申请信号量操作<span lang=EN-US>] //(1)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Exam = para;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; temp = Square_Exam( );<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; [</span>释放信号量操作<span lang=EN-US>]<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return temp;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; (1)</span>若申请不到<span lang=EN-US>&#8220;</span>信号量<span lang=EN-US>&#8221;</span>，说明另外的进程正处于给<span lang=EN-US>Exam</span>赋值并计算其平方过程中（即正在使用此信号）<span lang=EN-US>,</span>本进程必须等待其释放信号后，才可继续执行。若申请到信号，则可继续执行，但其它进程必须等待本进程释放信号量后，才能再使用本信号。<span lang=EN-US><br><br>&nbsp;&nbsp;&nbsp; </span>保证函数的可重入性的方法：<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; </span>在写函数时候尽量使用局部变量（例如寄存器、堆栈中的变量），对于要使用的全局变量要加以保护（如采取关中断、信号量等方法），这样构成的函数就一定是一个可重入的函数。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; VxWorks</span>中采取的可重入的技术有：<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; * </span>动态堆栈变量（各子函数有自己独立的堆栈空间）<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; * </span>受保护的全局变量和静态变量<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; * </span>任务变量<span lang=EN-US><br><br><br>--------------------------------------------------<br>&nbsp;&nbsp;&nbsp; </span>在实时系统的设计中，经常会出现多个任务调用同一个函数的情况。如果这个函数不幸被设计成为不可重入的函数的话，那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据，从而导致不可预料的后果。那么什么是可重入函数呢？所谓可重入函数是指一个可以被多个任务调用的过程，任务在调用时不必担心数据是否会出错。不可重入函数在实时系统设计中被视为不安全函数。满足下列条件的函数多数是不可重入的：<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; 1) </span>函数体内使用了静态的数据结构；<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; 2) </span>函数体内调用了<span lang=EN-US>malloc()</span>或者<span lang=EN-US>free()</span>函数；<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; 3) </span>函数体内调用了标准<span lang=EN-US>I/O</span>函数。<span lang=EN-US><br><br>&nbsp;&nbsp;&nbsp; </span>下面举例加以说明。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; A. </span>可重入函数<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; void strcpy(char *lpszDest, char *lpszSrc)<o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;</span>{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(*lpszDest++=*lpszSrc++);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *dest=0;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; B. </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">不可重入函数<span lang=EN-US>1<br>&nbsp;&nbsp;&nbsp; charcTemp;//</span>全局变量<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; void SwapChar1(char *lpcX, char *lpcY)<o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;</span>{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cTemp=*lpcX;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *lpcX=*lpcY;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; lpcY=cTemp;//</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">访问了全局变量<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; C. </span>不可重入函数<span lang=EN-US>2<br>&nbsp;&nbsp;&nbsp; void SwapChar2(char *lpcX,char *lpcY)<o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><span style="mso-spacerun: yes">&nbsp;</span>{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; static char cTemp;//</span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">静态局部变量<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cTemp=*lpcX;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *lpcX=*lpcY;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; lpcY=cTemp;//</span>使用了静态局部变量<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; </span>问题<span lang=EN-US>1</span>，如何编写可重入的函数？<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; </span>答：在函数体内不访问那些全局变量，不使用静态局部变量，坚持只使用局部变量，写出的函数就将是可重入的。如果必须访问全局变量，记住利用互斥信号量来保护全局变量。<span lang=EN-US><br><br>&nbsp;&nbsp;&nbsp; </span>问题<span lang=EN-US>2</span>，如何将一个不可重入的函数改写成可重入的函数？<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; </span>答：把一个不可重入函数变成可重入的唯一方法是用可重入规则来重写它。其实很简单，只要遵守了几条很容易理解的规则，那么写出来的函数就是可重入的。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; 1) </span>不要使用全局变量。因为别的代码很可能覆盖这些变量值。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; 2) </span>在和硬件发生交互的时候，切记执行类似<span lang=EN-US>disinterrupt()</span>之类的操作，就是关闭硬件中断。完成交互记得打开中断，在有些系列上，这叫做<span lang=EN-US>&#8220;</span>进入<span lang=EN-US>/</span>退出核心<span lang=EN-US>&#8221;</span>。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; 3) </span>不能调用其它任何不可重入的函数。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; 4) </span>谨慎使用堆栈。最好先在使用前先<span lang=EN-US>OS_ENTER_KERNAL</span>。<span lang=EN-US><br><br>&nbsp;&nbsp;&nbsp; </span>堆栈操作涉及内存分配，稍不留神就会造成益出导致覆盖其他任务的数据，所以，请谨慎使用堆栈！最好别用！很多黑客程序就利用了这一点以便系统执行非法代码从而轻松获得系统控制权。还有一些规则，总之，时刻记住一句话：保证中断是安全的！<span lang=EN-US><br><br>&nbsp;&nbsp;&nbsp; </span>实例问题：曾经设计过如下一个函数，在代码检视的时候被提醒有<span lang=EN-US>bug</span>，因为这个函数是不可重入的，为什么？<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; unsigned int sum_int( unsigned int base ) <o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned int index;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; static unsigned int sum = 0; // </span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">注意，是<span lang=EN-US>static</span>类型<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (index = 1; index &lt;= base; index++)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sum += index;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return sum;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; </span>分析：所谓的函数是可重入的（也可以说是可预测的），即只要输入数据相同就应产生相同的输出。这个函数之所以是不可预测的，就是因为函数中使用了<span lang=EN-US>static</span>变量，因为<span lang=EN-US>static</span>变量的特征，这样的函数被称为：带<span lang=EN-US>&#8220;</span>内部存储器<span lang=EN-US>&#8221;</span>功能的的函数。因此如果需要一个可重入的函数，一定要避免函数中使用<span lang=EN-US>static</span>变量，这种函数中的<span lang=EN-US>static</span>变量，使用原则是，能不用尽量不用。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; </span>将上面的函数修改为可重入的函数，只要将声明<span lang=EN-US>sum</span>变量中的<span lang=EN-US>static</span>关键字去掉，变量<span lang=EN-US>sum</span>即变为一个<span lang=EN-US>auto</span>类型的变量，函数即变为一个可重入的函数。<span lang=EN-US><br>&nbsp;&nbsp;&nbsp; </span>当然，有些时候，在函数中是必须要使用<span lang=EN-US>static</span>变量的，比如当某函数的返回值为指针类型时，则必须是<span lang=EN-US>static</span>的局部变量的地址作为返回值，若为<span lang=EN-US>auto</span>类型，则返回为错指针。</span><span lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/franksunny/aggbug/29269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2007-08-03 12:56 <a href="http://www.cppblog.com/franksunny/archive/2007/08/03/29269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>也谈关于时间[转载time.h从头学]</title><link>http://www.cppblog.com/franksunny/archive/2007/04/05/21360.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Thu, 05 Apr 2007 15:53:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2007/04/05/21360.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/21360.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2007/04/05/21360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/21360.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/21360.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 28pt; TEXT-ALIGN: center; mso-char-indent-count: 2.0" align=center><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也谈关于时间</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">最近转去搞低层些的单片机程序编程，在一块<span lang=EN-US>msp430</span>上要增加一个国际标准时间，由于以前在<span lang=EN-US>VC</span>中都是拿来用的，没遇到问题，也就不会去深究。在单片机上想用标准<span lang=EN-US>C</span>里面的<span lang=EN-US>time</span>（<span lang=EN-US>time_t*</span>）函数求得系统时间，最后结果出不来。后来才知道原来以前是取得的是操作系统的时间，汗死，单片机没系统的啊，希望能够尽早让我搞嵌入式啊，呵呵。<span lang=EN-US><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">后来自己弄明白了，设个时间值，然后用单片机晶振累加计数，还是可以用<span lang=EN-US>time.h</span>轻松实现标准时间计时的，而且方便不用考虑自己去写时间转换函数，以下是具体的<span lang=EN-US>time,h</span>的讲解，我就不再展开了。<span lang=EN-US><o:p></o:p></span></span></p>
<p style="TEXT-ALIGN: center" align=center><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">time.h</span><span style="FONT-SIZE: 10.5pt">从头学<span lang=EN-US><o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>本文从介绍基础概念入手，探讨了在<span lang=EN-US>C/C++</span>中对日期和时间操作所用到的数据结构和函数，并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了<span lang=EN-US>time.h</span>头文件中声明的各种函数和数据结构的详细使用方法。<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>关键字：<span lang=EN-US>UTC</span>（世界标准时间），<span lang=EN-US>Calendar Time</span>（日历时间），<span lang=EN-US>epoch</span>（时间点），<span lang=EN-US>clock tick</span>（时钟计时单元）<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><span style="mso-list: Ignore"><font face=宋体>1．</font><span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-SIZE: 10.5pt"><font face=宋体>概念<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>在<span lang=EN-US>C/C++</span>中，对字符串的操作有很多值得注意的问题，同样，<span lang=EN-US>C/C++</span>对时间的操作也有许多值得大家注意的地方。最近，在技术群中有很多网友也多次问到过<span lang=EN-US>C++</span>语言中对时间的操作、获取和显示等等的问题。下面，在这篇文章中，笔者将主要介绍在<span lang=EN-US>C/C++</span>中时间和日期的使用方法<span lang=EN-US>.&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>通过学习许多<span lang=EN-US>C/C++</span>库，你可以有很多操作、使用时间的方法。但在这之前你需要了解一些<span lang=EN-US>&#8220;</span>时间<span lang=EN-US>&#8221;</span>和<span lang=EN-US>&#8220;</span>日期<span lang=EN-US>&#8221;</span>的概念，主要有以下几个：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">Coordinated Universal Time</span><span style="FONT-SIZE: 10.5pt">（<span lang=EN-US>UTC</span>）：协调世界时，又称为世界标准时间，也就是大家所熟知的格林威治标准时间（<span lang=EN-US>Greenwich Mean Time</span>，<span lang=EN-US>GMT</span>）。比如，中国内地的时间与<span lang=EN-US>UTC</span>的时差为<span lang=EN-US>+8</span>，也就是<span lang=EN-US>UTC+8</span>。美国是<span lang=EN-US>UTC-5</span>。<span lang=EN-US>&nbsp;<o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">Calendar Time</span><span style="FONT-SIZE: 10.5pt">：日历时间，是用<span lang=EN-US>&#8220;</span>从一个标准时间点到此时的时间经过的秒数<span lang=EN-US>&#8221;</span>来表示的时间。这个标准时间点对不同的编译器来说会有所不同，但对一个编译系统来说，这个标准时间点是不变的，该编译系统中的时间对应的日历时间都通过该标准时间点来衡量，所以可以说日历时间是<span lang=EN-US>&#8220;</span>相对时间<span lang=EN-US>&#8221;</span>，但是无论你在哪一个时区，在同一时刻对同一个标准时间点来说，日历时间都是一样的。<span lang=EN-US><o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">epoch</span><span style="FONT-SIZE: 10.5pt">：时间点。时间点在标准<span lang=EN-US>C/C++</span>中是一个整数，它用此时的时间和标准时间点相差的秒数（即日历时间）来表示。<span lang=EN-US><o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">clock tick</span><span style="FONT-SIZE: 10.5pt">：时钟计时单元（而不把它叫做时钟滴答次数），一个时钟计时单元的时间长短是由<span lang=EN-US>CPU</span>控制的。一个<span lang=EN-US>clock tick</span>不是<span lang=EN-US>CPU</span>的一个时钟周期，而是<span lang=EN-US>C/C++</span>的一个基本计时单位。<span lang=EN-US><o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>我们可以使用<span lang=EN-US>ANSI</span>标准库中的<span lang=EN-US>time.h</span>头文件。这个头文件中定义的时间和日期所使用的方法，无论是在结构定义，还是命名，都具有明显的<span lang=EN-US>C</span>语言风格。下面，我将说明在<span lang=EN-US>C/C++</span>中怎样使用日期的时间功能。<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">2</span><span style="FONT-SIZE: 10.5pt">． 计时<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">C/C++</span><span style="FONT-SIZE: 10.5pt">中的计时函数是<span lang=EN-US>clock()</span>，而与其相关的数据类型是<span lang=EN-US>clock_t</span>。在<span lang=EN-US>MSDN</span>中，查得对<span lang=EN-US>clock</span>函数定义如下：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>clock_t clock( void );&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>这个函数返回从<span lang=EN-US>&#8220;</span>开启这个程序进程<span lang=EN-US>&#8221;</span>到<span lang=EN-US>&#8220;</span>程序中调用<span lang=EN-US>clock()</span>函数<span lang=EN-US>&#8221;</span>时之间的<span lang=EN-US>CPU</span>时钟计时单元（<span lang=EN-US>clock tick</span>）数，在<span lang=EN-US>MSDN</span>中称之为挂钟时间（<span lang=EN-US>wal-clock</span>）。其中<span lang=EN-US>clock_t</span>是用来保存时间的数据类型，在<span lang=EN-US>time.h</span>文件中，我们可以找到对它的定义：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>#ifndef _CLOCK_T_DEFINED&nbsp;&nbsp;<br>typedef long clock_t;&nbsp;&nbsp;<br>#define _CLOCK_T_DEFINED&nbsp;&nbsp;<br>#endif&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>很明显，<span lang=EN-US>clock_t</span>是一个长整形数。在<span lang=EN-US>time.h</span>文件中，还定义了一个常量<span lang=EN-US>CLOCKS_PER_SEC</span>，它用来表示一秒钟会有多少个时钟计时单元，其定义如下：<span lang=EN-US><o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>#define CLOCKS_PER_SEC ((clock_t)1000)<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>可以看到每过千分之一秒（<span lang=EN-US>1</span>毫秒），调用<span lang=EN-US>clock</span>（）函数返回的值就加<span lang=EN-US>1</span>。下面举个例子，你可以使用公式<span lang=EN-US>clock()/CLOCKS_PER_SEC</span>来计算一个进程自身的运行时间：<span lang=EN-US><o:p></o:p></span></font></span></p>
<p style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>void elapsed_time()&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>printf("Elapsed time:%u secs.\n",clock()/CLOCKS_PER_SEC);&nbsp;&nbsp;<br>}&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>当然，你也可以用<span lang=EN-US>clock</span>函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>#include &#8220;stdio.h&#8221;&nbsp;&nbsp;<br>#include &#8220;stdlib.h&#8221;&nbsp;&nbsp;<br>#include &#8220;time.h&#8221;&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>int main( void )&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>long i = <st1:chmetcnv w:st="on" UnitName="l" SourceValue="10000000" HasSpace="False" Negative="False" NumberType="1" TCSC="0">10000000L</st1:chmetcnv>;&nbsp;&nbsp;<br>clock_t start, finish;&nbsp;&nbsp;<br>double duration;&nbsp;&nbsp;<br>/* </font></span><span style="FONT-SIZE: 10.5pt"><font face=宋体>测量一个事件持续的时间</font><span lang=EN-US><font face=宋体>*/&nbsp;&nbsp;<br>printf( "Time to do %ld empty loops is ", i );&nbsp;&nbsp;<br>start = clock();&nbsp;&nbsp;<br>while( i-- ) ;&nbsp;&nbsp;<br>finish = clock();&nbsp;&nbsp;<br>duration = (double)(finish - start) / CLOCKS_PER_SEC;&nbsp;&nbsp;<br>printf( "%f seconds\n", duration ); <br>system("pause");&nbsp;&nbsp;<br>}&nbsp;&nbsp;<o:p></o:p></font></span></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>在笔者的机器上，运行结果如下：<span lang=EN-US><o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>Time to do 10000000 empty loops is 0.03000 seconds<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>上面我们看到时钟计时单元的长度为<span lang=EN-US>1</span>毫秒，那么计时的精度也为<span lang=EN-US>1</span>毫秒，那么我们可不可以通过改变<span lang=EN-US>CLOCKS_PER_SEC</span>的定义，通过把它定义的大一些，从而使计时精度更高呢？通过尝试，你会发现这样是不行的。在标准<span lang=EN-US>C/C++</span>中，最小的计时单位是一毫秒。<span lang=EN-US><o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">3</span><span style="FONT-SIZE: 10.5pt">．与日期和时间相关的数据结构<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>在标准<span lang=EN-US>C/C++</span>中，我们可通过<span lang=EN-US>tm</span>结构来获得日期和时间，<span lang=EN-US>tm</span>结构在<span lang=EN-US>time.h</span>中的定义如下：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>#ifndef _TM_DEFINED&nbsp;&nbsp;<br>struct tm {&nbsp;&nbsp;<br>int tm_sec; /* </font></span><span style="FONT-SIZE: 10.5pt"><font face=宋体>秒<span lang=EN-US> &#8211; </span>取值区间为</font><font face=宋体><span lang=EN-US>[0,59] */&nbsp;&nbsp;<br>int tm_min; /* </span>分<span lang=EN-US> - </span>取值区间为</font><font face=宋体><span lang=EN-US>[0,59] */&nbsp;&nbsp;<br>int tm_hour; /* </span>时<span lang=EN-US> - </span>取值区间为</font><font face=宋体><span lang=EN-US>[0,23] */&nbsp;&nbsp;<br>int tm_mday; /* </span>一个月中的日期<span lang=EN-US> - </span>取值区间为</font><font face=宋体><span lang=EN-US>[1,31] */&nbsp;&nbsp;<br>int tm_mon; /* </span>月份（从一月开始，<span lang=EN-US>0</span>代表一月）<span lang=EN-US> - </span>取值区间为</font><font face=宋体><span lang=EN-US>[0,11] */&nbsp;&nbsp;<br>int tm_year; /* </span>年份，其值等于实际年份减去</font><font face=宋体><span lang=EN-US>1900 */&nbsp;&nbsp;<br>int tm_wday; /* </span>星期<span lang=EN-US> &#8211; </span>取值区间为<span lang=EN-US>[0,6]</span>，其中<span lang=EN-US>0</span>代表星期天，<span lang=EN-US>1</span>代表星期一，以此类推</font><font face=宋体><span lang=EN-US> */&nbsp;&nbsp;<br>int tm_yday; /* </span>从每年的<st1:chsdate w:st="on" Year="2007" Month="1" Day="1" IsLunarDate="False" IsROCDate="False"><span lang=EN-US>1</span>月<span lang=EN-US>1</span>日</st1:chsdate>开始的天数<span lang=EN-US> &#8211; </span>取值区间为<span lang=EN-US>[0,365]</span>，其中<span lang=EN-US>0</span>代表<st1:chsdate w:st="on" Year="2007" Month="1" Day="1" IsLunarDate="False" IsROCDate="False"><span lang=EN-US>1</span>月<span lang=EN-US>1</span>日</st1:chsdate>，<span lang=EN-US>1</span>代表<st1:chsdate w:st="on" Year="2007" Month="1" Day="2" IsLunarDate="False" IsROCDate="False"><span lang=EN-US>1</span>月<span lang=EN-US>2</span>日</st1:chsdate>，以此类推</font><font face=宋体><span lang=EN-US> */&nbsp;&nbsp;<br>int tm_isdst; /* </span>夏令时标识符，实行夏令时的时候，<span lang=EN-US>tm_isdst</span>为正。不实行夏令时的进候，<span lang=EN-US>tm_isdst</span>为<span lang=EN-US>0</span>；不了解情况时，<span lang=EN-US>tm_isdst()</span>为负。</font><span lang=EN-US><font face=宋体>*/&nbsp;&nbsp;<br>};&nbsp;&nbsp;<br>#define _TM_DEFINED&nbsp;&nbsp;<br>#endif&nbsp;&nbsp;<o:p></o:p></font></span></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">ANSI C</span><span style="FONT-SIZE: 10.5pt">标准称使用<span lang=EN-US>tm</span>结构的这种时间表示为分解时间<span lang=EN-US>(broken-down time)</span>。<span lang=EN-US><o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>而日历时间（<span lang=EN-US>Calendar Time</span>）是通过<span lang=EN-US>time_t</span>数据类型来表示的，用<span lang=EN-US>time_t</span>表示的时间（日历时间）是从一个时间点（例如：<st1:chsdate w:st="on" Year="1970" Month="1" Day="1" IsLunarDate="False" IsROCDate="False"><span lang=EN-US>1970</span>年<span lang=EN-US>1</span>月<span lang=EN-US>1</span>日<span lang=EN-US>0</span>时<span lang=EN-US>0</span>分<span lang=EN-US>0</span>秒</st1:chsdate>）到此时的秒数。在<span lang=EN-US>time.h</span>中，我们也可以看到<span lang=EN-US>time_t</span>是一个长整型数：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>#ifndef _TIME_T_DEFINED&nbsp;&nbsp;<br>typedef long time_t; /* </font></span><span style="FONT-SIZE: 10.5pt"><font face=宋体>时间值</font><font face=宋体><span lang=EN-US> */&nbsp;&nbsp;<br>#define _TIME_T_DEFINED /* </span>避免重复定义</font><span lang=EN-US><font face=宋体> time_t */&nbsp;&nbsp;<br>#endif&nbsp;&nbsp;<o:p></o:p></font></span></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>大家可能会产生疑问：既然<span lang=EN-US>time_t</span>实际上是长整型，到未来的某一天，从一个时间点（一般是<st1:chsdate w:st="on" Year="1970" Month="1" Day="1" IsLunarDate="False" IsROCDate="False"><span lang=EN-US>1970</span>年<span lang=EN-US>1</span>月<span lang=EN-US>1</span>日<span lang=EN-US>0</span>时<span lang=EN-US>0</span>分<span lang=EN-US>0</span>秒</st1:chsdate>）到那时的秒数（即日历时间）超出了长整形所能表示的数的范围怎么办？对<span lang=EN-US>time_t</span>数据类型的值来说，它所表示的时间不能晚于<st1:chsdate w:st="on" Year="2038" Month="1" Day="18" IsLunarDate="False" IsROCDate="False"><span lang=EN-US>2038</span>年<span lang=EN-US>1</span>月<span lang=EN-US>18</span>日<span lang=EN-US>19</span>时<span lang=EN-US>14</span>分<span lang=EN-US>07</span>秒</st1:chsdate>。为了能够表示更久远的时间，一些编译器厂商引入了<span lang=EN-US>64</span>位甚至更长的整形数来保存日历时间。比如微软在<span lang=EN-US>Visual C++</span>中采用了<span lang=EN-US>__time64_t</span>数据类型来保存日历时间，并通过<span lang=EN-US>_time64()</span>函数来获得日历时间（而不是通过使用<span lang=EN-US>32</span>位字的<span lang=EN-US>time()</span>函数），这样就可以通过该数据类型保存<st1:chsdate w:st="on" Year="3001" Month="1" Day="1" IsLunarDate="False" IsROCDate="False"><span lang=EN-US>3001</span>年<span lang=EN-US>1</span>月<span lang=EN-US>1</span>日<span lang=EN-US>0</span>时<span lang=EN-US>0</span>分<span lang=EN-US>0</span>秒</st1:chsdate>（不包括该时间点）之前的时间。<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>在<span lang=EN-US>time.h</span>头文件中，我们还可以看到一些函数，它们都是以<span lang=EN-US>time_t</span>为参数类型或返回值类型的函数：<span lang=EN-US><o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>double difftime(time_t time1, time_t time0);&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>time_t mktime(struct tm * timeptr);&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>time_t time(time_t * timer);&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>char * asctime(const struct tm * timeptr);<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>char * ctime(const time_t *timer);&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>此外，<span lang=EN-US>time.h</span>还提供了两种不同的函数将日历时间（一个用<span lang=EN-US>time_t</span>表示的整数）转换为我们平时看到的把年月日时分秒分开显示的时间格式<span lang=EN-US>tm</span>：<span lang=EN-US><o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>struct tm * gmtime(const time_t *timer);&nbsp;struct tm * localtime(const time_t * timer);<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>通过查阅<span lang=EN-US>MSDN</span>，我们可以知道<span lang=EN-US>Microsoft C/C++ 7.0</span>中时间点的值（<span lang=EN-US>time_t</span>对象的值）是从<st1:chsdate w:st="on" Year="1899" Month="12" Day="31" IsLunarDate="False" IsROCDate="False"><span lang=EN-US>1899</span>年<span lang=EN-US>12</span>月<span lang=EN-US>31</span>日<span lang=EN-US>0</span>时<span lang=EN-US>0</span>分<span lang=EN-US>0</span>秒</st1:chsdate>到该时间点所经过的秒数，而其它各种版本的<span lang=EN-US>Microsoft C/C++</span>和所有不同版本的<span lang=EN-US>Visual C++</span>都是计算的从<st1:chsdate w:st="on" Year="1970" Month="1" Day="1" IsLunarDate="False" IsROCDate="False"><span lang=EN-US>1970</span>年<span lang=EN-US>1</span>月<span lang=EN-US>1</span>日<span lang=EN-US>0</span>时<span lang=EN-US>0</span>分<span lang=EN-US>0</span>秒</st1:chsdate>到该时间点所经过的秒数。<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">4</span><span style="FONT-SIZE: 10.5pt">．与日期和时间相关的函数及应用<span lang=EN-US><o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>在本节，我将向大家展示怎样利用<span lang=EN-US>time.h</span>中声明的函数对时间进行操作。这些操作包括取当前时间、计算时间间隔、以不同的形式显示时间等内容。<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">4.1 </span><span style="FONT-SIZE: 10.5pt">获得日历时间<span lang=EN-US><o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>我们可以通过<span lang=EN-US>time()</span>函数来获得日历时间（<span lang=EN-US>Calendar Time</span>），其原型为：<span lang=EN-US><o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>time_t time(time_t * timer);<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-SIZE: 10.5pt"><font face=宋体>如果你已经声明了参数<span lang=EN-US>timer</span>，你可以从参数<span lang=EN-US>timer</span>返回现在的日历时间，同时也可以通过返回值返回现在的日历时间，即从一个时间点（例如：<st1:chsdate w:st="on" Year="1970" Month="1" Day="1" IsLunarDate="False" IsROCDate="False"><span lang=EN-US>1970</span>年<span lang=EN-US>1</span>月<span lang=EN-US>1</span>日<span lang=EN-US>0</span>时<span lang=EN-US>0</span>分<span lang=EN-US>0</span>秒</st1:chsdate>）到现在此时的秒数。如果参数为空（<span lang=EN-US>NUL</span>），函数将只通过返回值返回现在的日历时间，比如下面这个例子用来显示当前的日历时间：<span lang=EN-US><o:p></o:p></span></font></span></p>
<p style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>#include "time.h"&nbsp;&nbsp;<br>#include "stdio.h"&nbsp;&nbsp;<br>int main(void)&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>struct tm *ptr;&nbsp;&nbsp;<br>time_t lt;&nbsp;&nbsp;<br>lt =time(NUL);&nbsp;&nbsp;<br>printf("The Calendar Time now is %d\n",lt);&nbsp;&nbsp;<br>return 0;&nbsp;&nbsp;<br>}&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>运行的结果与当时的时间有关，我当时运行的结果是：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>The Calendar Time now is 1122707619&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>其中<span lang=EN-US>1122707619</span>就是我运行程序时的日历时间。即从<st1:chsdate w:st="on" Year="1970" Month="1" Day="1" IsLunarDate="False" IsROCDate="False"><span lang=EN-US>1970</span>年<span lang=EN-US>1</span>月<span lang=EN-US>1</span>日<span lang=EN-US>0</span>时<span lang=EN-US>0</span>分<span lang=EN-US>0</span>秒</st1:chsdate>到此时的秒数。<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">4.2 </span><span style="FONT-SIZE: 10.5pt">获得日期和时间<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>这里说的日期和时间就是我们平时所说的年、月、日、时、分、秒等信息。从第<span lang=EN-US>2</span>节我们已经知道这些信息都保存在一个名为<span lang=EN-US>tm</span>的结构体中，那么如何将一个日历时间保存为一个<span lang=EN-US>tm</span>结构的对象呢？<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>其中可以使用的函数是<span lang=EN-US>gmtime()</span>和<span lang=EN-US>localtime()</span>，这两个函数的原型为：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>struct tm * gmtime(const time_t *timer);&nbsp;&nbsp;<br>struct tm * localtime(const time_t * timer);&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>其中<span lang=EN-US>gmtime()</span>函数是将日历时间转化为世界标准时间（即格林尼治时间），并返回一个<span lang=EN-US>tm</span>结构体来保存这个时间，而<span lang=EN-US>localtime()</span>函数是将日历时间转化为本地时间。比如现在用<span lang=EN-US>gmtime()</span>函数获得的世界标准时间是<st1:chsdate w:st="on" Year="2005" Month="7" Day="30" IsLunarDate="False" IsROCDate="False"><span lang=EN-US>2005</span>年<span lang=EN-US>7</span>月<span lang=EN-US>30</span>日<span lang=EN-US>7</span>点<span lang=EN-US>18</span>分<span lang=EN-US>20</span>秒</st1:chsdate>，那么我用<span lang=EN-US>localtime()</span>函数在中国地区获得的本地时间会比世界标准时间晚<span lang=EN-US>8</span>个小时，即<st1:chsdate w:st="on" Year="2005" Month="7" Day="30" IsLunarDate="False" IsROCDate="False"><span lang=EN-US>2005</span>年<span lang=EN-US>7</span>月<span lang=EN-US>30</span>日<span lang=EN-US>15</span>点<span lang=EN-US>18</span>分<span lang=EN-US>20</span>秒</st1:chsdate>。下面是个例子：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>#include "time.h"&nbsp;&nbsp;<br>#include "stdio.h"&nbsp;&nbsp;<br>int main(void)&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>struct tm *local;&nbsp;&nbsp;<br>time_t t;&nbsp;&nbsp;<br>t=time(NUL);&nbsp;&nbsp;<br>local=localtime(&amp;t);&nbsp;&nbsp;<br>printf("Local hour is: %d\n",local-&gt;tm_hour);&nbsp;&nbsp;<br>local=gmtime(&amp;t);&nbsp;&nbsp;<br>printf("UTC hour is: %d\n",local-&gt;tm_hour);&nbsp;&nbsp;<br>return 0;&nbsp;&nbsp;<br>}&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>运行结果是：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>Local hour is: 15&nbsp;&nbsp;<br>UTC hour is: 7&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">4.3 </span><span style="FONT-SIZE: 10.5pt">固定的时间格式<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>我们可以通过<span lang=EN-US>asctime()</span>函数和<span lang=EN-US>ctime()</span>函数将时间以固定的格式显示出来，两者的返回值都是<span lang=EN-US>char*</span>型的字符串。返回的时间格式为：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>星期几 月份日期 时<span lang=EN-US>:</span>分<span lang=EN-US>:</span>秒 年</font><font face=宋体><span lang=EN-US>\n\0&nbsp;&nbsp;<br></span>例如：<span lang=EN-US>Wed Jan 02 02:03:55 1980\n\0&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>其中<span lang=EN-US>\n</span>是一个换行符，<span lang=EN-US>\0</span>是一个空字符，表示字符串结束。下面是两个函数的原型：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>char * asctime(const struct tm * timeptr);&nbsp;&nbsp;<br>char * ctime(const time_t *timer);&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>其中<span lang=EN-US>asctime()</span>函数是通过<span lang=EN-US>tm</span>结构来生成具有固定格式的保存时间信息的字符串，而<span lang=EN-US>ctime()</span>是通过日历时间来生成时间字符串。这样的话，<span lang=EN-US>asctime</span>（）函数只是把<span lang=EN-US>tm</span>结构对象中的各个域填到时间字符串的相应位置就行了，而<span lang=EN-US>ctime</span>（）函数需要先参照本地的时间设置，把日历时间转化为本地时间，然后再生成格式化后的字符串。在下面，如果<span lang=EN-US>t</span>是一个非空的<span lang=EN-US>time_t</span>变量的话，那么：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>printf(ctime(&amp;t));&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>等价于：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>struct tm *ptr;&nbsp;&nbsp;<br>ptr=localtime(&amp;t);&nbsp;&nbsp;<br>printf(asctime(ptr));&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>那么，下面这个程序的两条<span lang=EN-US>printf</span>语句输出的结果就是不同的了（除非你将本地时区设为世界标准时间所在的时区）：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>#include "time.h"&nbsp;&nbsp;<br>#include "stdio.h"&nbsp;&nbsp;<br>int main(void)&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>struct tm *ptr;&nbsp;&nbsp;<br>time_t lt;&nbsp;&nbsp;<br>lt =time(NUL);&nbsp;&nbsp;<br>ptr=gmtime(&lt;);&nbsp;&nbsp;<br>printf(asctime(ptr));&nbsp;&nbsp;<br>printf(ctime(&lt;));&nbsp;&nbsp;<br>return 0;&nbsp;&nbsp;<br>}&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>运行结果：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>Sat Jul 30 08:43:03 2005&nbsp;&nbsp;<br>Sat Jul 30 16:43:03 2005&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">4.4 </span><span style="FONT-SIZE: 10.5pt">自定义时间格式<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>我们可以使用<span lang=EN-US>strftime</span>（）函数将时间格式化为我们想要的格式。它的原型如下：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">size_t strftime(&nbsp;&nbsp;<br>char *strDest,&nbsp;&nbsp;<br>size_t maxsize,&nbsp;&nbsp;<br>const char *format,&nbsp;&nbsp;<br>const struct tm *timeptr&nbsp;&nbsp;<br>);<br></span><span style="FONT-SIZE: 10.5pt">我们可以根据<span lang=EN-US>format</span>指向字符串中格式命令把<span lang=EN-US>timeptr</span>中保存的时间信息放在<span lang=EN-US>strDest</span>指向的字符串中，最多向<span lang=EN-US>strDest</span>中存放<span lang=EN-US>maxsize</span>个字符。该函数返回向<span lang=EN-US>strDest</span>指向的字符串中放置的字符数。<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>函数<span lang=EN-US>strftime()</span>的操作有些类似于<span lang=EN-US>sprintf()</span>：识别以百分号<span lang=EN-US>(%)</span>开始的格式命令集合，格式化输出结果放在一个字符串中。格式化命令说明串<span lang=EN-US>strDest</span>中各种日期和时间信息的确切表示方法。格式串中的其他字符原样放进串中。格式命令列在下面，它们是区分大小写的。<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: red"><font face=宋体>%a </font></span><span style="FONT-SIZE: 10.5pt; COLOR: red"><font face=宋体>星期几的简写</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%A </span>星期几的全称</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%b </span>月分的简写</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%B </span>月份的全称</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%c </span>标准的日期的时间串</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%C </span>年份的后两位数字</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%d </span>十进制表示的每月的第几天</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%D </span>月<span lang=EN-US>/</span>天<span lang=EN-US>/</span>年</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%e </span>在两字符域中，十进制表示的每月的第几天</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%F </span>年<span lang=EN-US>-</span>月<span lang=EN-US>-</span>日</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%g </span>年份的后两位数字，使用基于周的年</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%G </span>年分，使用基于周的年</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%h </span>简写的月份名</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%H 24</span>小时制的小时</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%I 12</span>小时制的小时</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%j </span>十进制表示的每年的第几天</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%m </span>十进制表示的月份</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%M </span>十时制表示的分钟数</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%n </span>新行符</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%p </span>本地的<span lang=EN-US>AM</span>或<span lang=EN-US>PM</span>的等价显示</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%r 12</span>小时的时间</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%R </span>显示小时和分钟：</font><font face=宋体><span lang=EN-US>hh:mm&nbsp;&nbsp;<br>%S </span>十进制的秒数</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%t </span>水平制表符</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%T </span>显示时分秒：</font><font face=宋体><span lang=EN-US>hh:mm:ss&nbsp;&nbsp;<br>%u </span>每周的第几天，星期一为第一天 （值从<span lang=EN-US>0</span>到<span lang=EN-US>6</span>，星期一为<span lang=EN-US>0</span>）</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%U </span>第年的第几周，把星期日做为第一天（值从<span lang=EN-US>0</span>到<span lang=EN-US>53</span>）</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%V </span>每年的第几周，使用基于周的年</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%w </span>十进制表示的星期几（值从<span lang=EN-US>0</span>到<span lang=EN-US>6</span>，星期天为<span lang=EN-US>0</span>）</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%W </span>每年的第几周，把星期一做为第一天（值从<span lang=EN-US>0</span>到<span lang=EN-US>53</span>）</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%x </span>标准的日期串</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%X </span>标准的时间串</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%y </span>不带世纪的十进制年份（值从<span lang=EN-US>0</span>到<span lang=EN-US>99</span>）</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%Y </span>带世纪部分的十进制年份</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%z</span>，<span lang=EN-US>%Z </span>时区名称，如果不能得到时区名称则返回空字符。</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>%% </span>百分号<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>如果想显示现在是几点了，并以<span lang=EN-US>12</span>小时制显示，就象下面这段程序：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>#include &#8220;time.h&#8221;&nbsp;&nbsp;<br>#include &#8220;stdio.h&#8221;&nbsp;&nbsp;<br>int main(void)&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>struct tm *ptr;&nbsp;&nbsp;<br>time_t lt;&nbsp;&nbsp;<br>char str[80];&nbsp;&nbsp;<br>lt=time(NUL);&nbsp;&nbsp;<br>ptr=localtime(&lt;);&nbsp;&nbsp;<br>strftime(str,100,"It is now %I %p",ptr);&nbsp;&nbsp;<br>printf(str);&nbsp;&nbsp;<br>return 0;&nbsp;&nbsp;<br>}&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>其运行结果为：</font><span lang=EN-US><font face=宋体>&nbsp;&nbsp;<br>It is now 4PM&nbsp;&nbsp;<o:p></o:p></font></span></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>而下面的程序则显示当前的完整日期：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>#include &lt;stdio.h&gt;&nbsp;&nbsp;<br>#include &lt;time.h&gt;&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>void main( void )&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>struct tm *newtime;&nbsp;&nbsp;<br>char tmpbuf[128];&nbsp;&nbsp;<br>time_t lt1;&nbsp;&nbsp;<br>time( &lt;1 );&nbsp;&nbsp;<br>newtime=localtime(&lt;1);&nbsp;&nbsp;<br>strftime( tmpbuf, 128, "Today is %A, day %d of %B in the year %Y.\n", newtime);&nbsp;&nbsp;<br>printf(tmpbuf);&nbsp;&nbsp;<br>}&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>运行结果：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>Today is Saturday, day 30 of July in the year 2005.&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">4.5 </span><span style="FONT-SIZE: 10.5pt">计算持续时间的长度<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>有时候在实际应用中要计算一个事件持续的时间长度，比如计算打字速度。在第<span lang=EN-US>1</span>节计时部分中，我已经用<span lang=EN-US>clock</span>函数举了一个例子。<span lang=EN-US>Clock()</span>函数可以精确到毫秒级。同时，我们也可以使用<span lang=EN-US>difftime()</span>函数，但它只能精确到秒。该函数的定义如下：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>double difftime(time_t time1, time_t time0);&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>虽然该函数返回的以秒计算的时间间隔是<span lang=EN-US>double</span>类型的，但这并不说明该时间具有同<span lang=EN-US>double</span>一样的精确度，这是由它的参数觉得的（<span lang=EN-US>time_t</span>是以秒为单位计算的）。比如下面一段程序：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>#include "time.h"&nbsp;&nbsp;<br>#include "stdio.h"&nbsp;&nbsp;<br>#include "stdlib.h"&nbsp;&nbsp;<br>int main(void)&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>time_t start,end;&nbsp;&nbsp;<br>start = time(NUL);&nbsp;&nbsp;<br>system("pause");&nbsp;&nbsp;<br>end = time(NUL);&nbsp;&nbsp;<br>printf("The pause used %f seconds.\n",difftime(end,start));//&lt;-&nbsp;&nbsp;<br>system("pause");&nbsp;&nbsp;<br>return 0;&nbsp;&nbsp;<br>}&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>运行结果为：</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br></span>请按任意键继续</font><font face=宋体><span lang=EN-US>. . .&nbsp;&nbsp;<br>The pause used 2.000000 seconds.&nbsp;&nbsp;<br></span>请按任意键继续<span lang=EN-US>. . .&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>可以想像，暂停的时间并不那么巧是整整<span lang=EN-US>2</span>秒钟。其实，你将上面程序的带有<span lang=EN-US>&#8220;//&lt;-&#8221;</span>注释的一行用下面的一行代码替换：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>printf("The pause used %f seconds.\n",end-start);&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>其运行结果是一样的。<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><font face=宋体><span lang=EN-US style="FONT-SIZE: 10.5pt">4.6 </span><span style="FONT-SIZE: 10.5pt">分解时间转化为日历时间<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></span></font></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>这里说的分解时间就是以年、月、日、时、分、秒等分量保存的时间结构，在<span lang=EN-US>C/C++</span>中是<span lang=EN-US>tm</span>结构。我们可以使用<span lang=EN-US>mktime</span>（）函数将用<span lang=EN-US>tm</span>结构表示的时间转化为日历时间。其函数原型如下：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>time_t mktime(struct tm * timeptr);&nbsp;&nbsp;<o:p></o:p></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt"><font face=宋体>其返回值就是转化后的日历时间。这样我们就可以先制定一个分解时间，然后对这个时间进行操作了，下面的例子可以计算出<st1:chsdate w:st="on" Year="1997" Month="7" Day="1" IsLunarDate="False" IsROCDate="False"><span lang=EN-US>1997</span>年<span lang=EN-US>7</span>月<span lang=EN-US>1</span>日</st1:chsdate>是星期几：<span lang=EN-US>&nbsp;&nbsp;<o:p></o:p></span></font></span></p>
<p style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 10.5pt"><font face=宋体>#include "time.h"&nbsp;&nbsp;<br>#include "stdio.h"&nbsp;&nbsp;<br>#include "stdlib.h"&nbsp;&nbsp;<br>int main(void)&nbsp;&nbsp;<br>{&nbsp;&nbsp;<br>struct tm t;&nbsp;&nbsp;<br>time_t t_of_day;&nbsp;&nbsp;<br>t.tm_year=1997-1900;&nbsp;&nbsp;<br>t.tm_mon=6;&nbsp;&nbsp;<br>t.tm_mday=1;&nbsp;&nbsp;<br>t.tm_hour=0;&nbsp;&nbsp;<br>t.tm_min=0;&nbsp;&nbsp;<br>t.tm_sec=1;&nbsp;&nbsp;<br>t.tm_isdst=0;&nbsp;&nbsp;<br>t_of_day=mktime(&amp;t);&nbsp;&nbsp;<br>printf(ctime(&amp;t_of_day));&nbsp;&nbsp;<br>return 0;&nbsp;&nbsp;<br>}&nbsp;&nbsp;<br></font></span><span style="FONT-SIZE: 10.5pt"><font face=宋体>运行结果：</font><font face=宋体><span lang=EN-US>&nbsp;&nbsp;<br>Tue Jul 01 00:00:01 1997&nbsp;&nbsp;<br></span>现在注意了，有了<span lang=EN-US>mktime()</span>函数，是不是我们可以操作现在之前的任何时间呢？你可以通过这种办法算出<span lang=EN-US>1945</span>年<span lang=EN-US>8</span>月<span lang=EN-US>15</span>号是星期几吗？答案是否定的。因为这个时间在<st1:chsdate w:st="on" Year="1970" Month="1" Day="1" IsLunarDate="False" IsROCDate="False"><span lang=EN-US>1970</span>年<span lang=EN-US>1</span>月<span lang=EN-US>1</span>日</st1:chsdate>之前，所以在大多数编译器中，这样的程序虽然可以编译通过，但运行时会异常终止。<span lang=EN-US><o:p></o:p></span></font></span></p>
<img src ="http://www.cppblog.com/franksunny/aggbug/21360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2007-04-05 23:53 <a href="http://www.cppblog.com/franksunny/archive/2007/04/05/21360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>由switch选择结构理解局部变量</title><link>http://www.cppblog.com/franksunny/archive/2007/04/05/21358.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Thu, 05 Apr 2007 15:25:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2007/04/05/21358.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/21358.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2007/04/05/21358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/21358.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/21358.html</trackback:ping><description><![CDATA[&nbsp; <span>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由</span><span lang=EN-US style="FONT-SIZE: 14pt">switch</span><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">选择结构理解局部变量</span><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">函数体内部自定义变量，称为局部变量，存储于栈（</span><span lang=EN-US>stack</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）中，由编译器自动分配和释放，局部变量的生存期（或者说作用域）是当前函数内部，使用时必须初始化，否则其值将不定。以前对局部变量的定义也就是这么多，而且也就那么在用。近期碰到如下一个问题：</span></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333">void func( void ) <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333">{ <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>int x = 2; <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>switch ( x ) <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>{<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>int m =0;<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//initialization skipped by case0,case1,case2,default <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>case 0 :<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>int i = 0;<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//initialization skipped by case1,case2,default <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>{ int j = 1; }<span style="mso-spacerun: yes">&nbsp;&nbsp; </span>// OK, initialized in enclosing block<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>break;<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>case 1 : <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>break;<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>case 2:<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>break;<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>default:<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>int k = 1;<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// OK, initialization not skipped<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>} <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: #333333">}<o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">遇到这个问题，网上的解答很多，很多人觉得</span><span lang=EN-US>switch</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内不能定义局部变量，这个明显是不对的。因为我把代码改成以下形式后就完全可以用了。</span></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt">void func( void ) <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt">{ <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>int x = 2; <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>switch ( x ) <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>{<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>int m;<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>m = 0;<span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//without execute; <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>case 0:<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>int i;<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>i = 0; <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>{ int j = 1; }<span style="mso-spacerun: yes">&nbsp;&nbsp; </span>// OK, initialized in enclosing block <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>printf("%d<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>%d\n", m, i);<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>break;<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>case 1: <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>i = 1;<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>printf("%d<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>%d\n", m, i);<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>break;<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>case 2:<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>i = 2;<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>printf("%d<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>%d\n", m, i);<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>break;<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>default:<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>int k = 1;<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// OK, initialization not skipped<o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>} <o:p></o:p></span></strong></p>
<p class=MsoNormal style="BACKGROUND: #cccccc; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24.1pt; mso-char-indent-count: 2.0"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 12pt">}<o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">编译时有一个</span><span lang=EN-US>warning</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，即&#8220;</span><span lang=EN-US>local variable 'm' used without having been initialized</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8221;，执行结果为：</span><span lang=EN-US>-858993460<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>2</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因此</span><span lang=EN-US>switch</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内不但可以定义变量，而且也不用像很多人所说的在</span><span lang=EN-US>case</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内遇到要用变量时一定要用</span><span lang=EN-US>{}</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">括起来，不过严格的说不用</span><span lang=EN-US>{}</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">扩起来的变量是是属于整个</span><span lang=EN-US>switch</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">块结构的，为此编程一定要将新增变量作用域限定在</span><span lang=EN-US>case</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内就必须要用</span><span lang=EN-US>{}</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过</span><span lang=EN-US>switch</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#183;&#183;&#183;</span><span lang=EN-US>case</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构，对局部变量的声明、定义以及初始化等概念可以有一个比较清晰的认识。我的理解就是：声明语句不管是放在哪里，其编译时都是将其置顶到块的头部，如</span><span lang=EN-US>int k</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">虽然在</span><span lang=EN-US>default</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，但是这个变量的声明就在</span><span lang=EN-US>switch</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US>{}</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">内，其生存期与变量</span><span lang=EN-US>m</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等同，只是由于前面没有声明，所以</span><span lang=EN-US>default</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之前不能用。</span></p>
<p align=center></span></p>
<img src ="http://www.cppblog.com/franksunny/aggbug/21358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2007-04-05 23:25 <a href="http://www.cppblog.com/franksunny/archive/2007/04/05/21358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己实现String类（网讯笔试归来）</title><link>http://www.cppblog.com/franksunny/archive/2007/03/04/19199.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Sun, 04 Mar 2007 13:53:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2007/03/04/19199.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/19199.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2007/03/04/19199.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/19199.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/19199.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">网讯笔试归来</span> </strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="FONT-SIZE: 14pt"><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">昨天去网讯（杭州）笔试了，做了下笔试题，感觉题目都不难，但是自己做的的确不怎么样，估计是没机会去了，不过暂时还是先把几道自己还记得的题目，写出来，总结下，以做复习。</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">1、<span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要求自己实现</span> <span lang=EN-US>String</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类，给出了</span> <span lang=EN-US>String</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的以下头文件类声明</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>class String</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>public:</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String(const char *m_char = NULL);</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String(const String &amp; Str);</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>String&amp; operator = (const String &amp;Str);</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>~String();</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>private:</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>char * m_Data;</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>};</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p> </span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于</span> <span lang=EN-US>String</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的笔试题，以前看林锐的随笔时听说他在微软面试时曾碰到那么一道题目，我自己也没有真的下笔去做过，平常都是拿来就用的，这次自己碰到，才知道会死得那么惨，反正编得不堪入目（我就不拿出来献丑了），下面是我回来后，自己重新写的答案。</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>String::String(const char* m_char)</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int m_nLength = strlen(m_char) + 1;</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (m_Data != NULL)</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>delete [] m_Data;</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>m_Data = NULL;</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}//</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以上判断是否必要</span> <span lang=EN-US>??</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>m_Data = new char[m_nLength];</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>memcpy(m_Data, m_char, m_nLength);</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>}</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p> </span></p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>String::String(const String &amp;Str)</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int m_nLength = strlen(Str.m_Data) + 1;//</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以前真的不知道，原来对象的私有变量</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 194.25pt; mso-char-indent-count: 18.5"><span lang=EN-US>//</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在类的实现代码中也是可以访问的</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (m_Data != NULL)</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>delete [] m_Data;</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>m_Data = NULL;</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}//</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以上判断是否必要</span> <span lang=EN-US>??</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>m_Data = new char[m_nLength];</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>memcpy(m_Data, Str.m_Data, m_nLength);</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>}</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p> </span></p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>String&amp; String::operator = (const String&amp; Str)<span style="mso-spacerun: yes">&nbsp; </span></span></p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(this == &amp;Str)</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return *this;</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p> </span></p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>int m_nLength = strlen(Str.m_Data) + 1;</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (m_Data != NULL)</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>delete [] m_Data;</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>m_Data = NULL;</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}//</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以上判断是否必要</span> <span lang=EN-US>??</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>m_Data = new char[m_nLength];</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>memcpy(m_Data, Str.m_Data, m_nLength);</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return *this;</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>}</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p> </span></p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>String::~String()</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (m_Data != NULL)</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>delete [] m_Data;</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>m_Data = NULL;</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>}</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p> </span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">2、<span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于内存分配</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个题目很简单，就给了一个函数，然后问函数内的局部变量存放在哪里，我也不知道为什么当时会选择</span> <span lang=EN-US>heap(</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">堆</span> <span lang=EN-US>)</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，下面再把几个概念罗列出来：</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 47.25pt; TEXT-INDENT: -26.25pt; mso-list: l0 level2 lfo1; tab-stops: list 47.25pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">堆区（</span> <span lang=EN-US>heap</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）：由程序员申请分配和释放，属动态内存分配方式，若程序员不释放，程序结束时可能会由</span> <span lang=EN-US>OS</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">回收。不过这个内存分配很容易引起问题，如果申请的内存不释放就会造成内存泄漏；如果释放的不是所要释放的内存，则轻者引起程序运行结果出错，重者系统崩溃。</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 47.25pt; TEXT-INDENT: -26.25pt; mso-list: l0 level2 lfo1; tab-stops: list 47.25pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">2.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">栈区（</span> <span lang=EN-US>stack</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）：编译器自动分配释放，存放函数的形参值、局部变量的值，也是属于动态内存分配方式，它由系统分配，所以执行效率也高，不过自由度小，声明时就得决定其具体大小。</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 47.25pt; TEXT-INDENT: -26.25pt; mso-list: l0 level2 lfo1; tab-stops: list 47.25pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">3.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">全局区（静态区）（</span> <span lang=EN-US>static</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）：全局变量和静态变量的存储是放在一块的，而且初始化的全局变量和静态变量在一块区域，未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放，所以也不会造成内存问题。</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">除了以上的变量外，还有两类存放位置，文字常量区和程序代码区，两者都是由系统分配和释放，且文字常量区和前面三区合成为程序数据区，与程序代码区相对应。</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">3、<span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关于类继承的构造和析构函数</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>class Base</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>public:</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Base(){cout&lt;&lt; "Base" &lt;&lt;endl;};</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>~Base(){cout&lt;&lt;"~Base"&lt;&lt;endl;};</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>protected:</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>private:</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>};</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p> </span></p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>class First:public Base</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>public:</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>First(){cout &lt;&lt; "First" &lt;&lt; endl;};</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>~First(){cout &lt;&lt; "~First" &lt;&lt;endl;};</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>};</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p> </span></p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>int main()</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>{</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Base *a = new First;</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>delete a;</span> </p>
<p class=MsoNormal style="BACKGROUND: silver; MARGIN: 0cm 0cm 0pt"><span lang=EN-US>}</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">问程序的输出会是什么？</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结果很简单，也就是</span> <span lang=EN-US>Base</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>First</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>~Base</span> </p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其它还有一个关于</span> <span lang=EN-US>&amp;</span> <span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的题目，把我搞的云里雾里的，还要再看些东西才知道怎么来解释。</span> </p>
<img src ="http://www.cppblog.com/franksunny/aggbug/19199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2007-03-04 21:53 <a href="http://www.cppblog.com/franksunny/archive/2007/03/04/19199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]关于对齐和sizeof函数</title><link>http://www.cppblog.com/franksunny/archive/2006/12/27/16894.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Tue, 26 Dec 2006 16:01:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2006/12/27/16894.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/16894.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2006/12/27/16894.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/16894.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/16894.html</trackback:ping><description><![CDATA[好久没来这里了，一个多月没来，今天上来，发现有人对我以前转载的一篇关于struct对齐的文章提到的东东，提出了很好的质疑，我很感谢这位仁兄，关于这个问题，网上帖子很多，自己看了，觉得也没啥好整理的，看大牛的吧，以下是各大牛文章的链接，我就权当是Mark一下吧，呵呵。<br><br>关于指针和数组、结构和类的sizeof讲解<a href="http://blog.vckbase.com/billdavid/archive/2004/06/23/509.html">http://blog.vckbase.com/billdavid/archive/2004/06/23/509.html</a><br>关于联合体的sizeof讲解<a href="http://blog.vckbase.com/smileonce/archive/2005/08/08/10658.html">http://blog.vckbase.com/smileonce/archive/2005/08/08/10658.html</a><br>关于对齐的小结性文章<a href="http://blog.vckbase.com/zhangjw_cn/archive/2005/08/09/10701.html">http://blog.vckbase.com/zhangjw_cn/archive/2005/08/09/10701.html</a><br>自己懒得打开链接，再把小结性文章的小结，也拿来转一下。<br><br>最后得到了以下结论：<br>&nbsp;&nbsp;&nbsp;&nbsp;1. 成员的对齐是按声明顺序进行的；<br>&nbsp;&nbsp;&nbsp;&nbsp;2. 对齐值由编译指示和最大成员两者较小的值决定；<br>&nbsp;&nbsp;&nbsp;&nbsp;3. 未对齐到对齐值的成员一起形成块对齐（联合对齐）；<br>&nbsp;&nbsp;&nbsp;&nbsp;4. 上一个（下一个）对齐采用自己较大则不变，自己较小则填充自己对齐到上一个（下一个）大小；<br>&nbsp;&nbsp;&nbsp;&nbsp;5.&nbsp;每成员对齐：如果前面已对齐到对齐值，下一个对齐自己。如果前面未对齐到对齐值，如果加上下一个成员不大于对齐值，下一个对齐自己，否则填充自己块对齐到对齐值。<br>&nbsp;&nbsp;&nbsp;&nbsp;6. 最后还未对齐到对齐值的，填充空间块对齐到对齐值。<br><br>从这些结论，可以得到：<br>&nbsp;&nbsp;&nbsp;&nbsp;1. 以上的对齐原则其实是尽量整齐排列、尽量节省内存。<br>&nbsp;&nbsp;&nbsp;&nbsp;2. 声明成员应该尽量避免不同类型错杂开来，最好采用从小到大或者从大到小的顺序（错开后，会因为上对齐和下对齐而增加填充开销）。<br>&nbsp;&nbsp;&nbsp;&nbsp;3. 编译器缺省采用8字节对齐主要是因为最大基本类型为8自己（以前自己不明白，在论坛提过问，后来，以为是SSE指令的原因）。<br>&nbsp;&nbsp;&nbsp;&nbsp;4. 手算sizeof是没有必要的，负责的（可以先对齐出对齐块，用块数乘对齐值）。 
<img src ="http://www.cppblog.com/franksunny/aggbug/16894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2006-12-27 00:01 <a href="http://www.cppblog.com/franksunny/archive/2006/12/27/16894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>笔记一、数据类型</title><link>http://www.cppblog.com/franksunny/archive/2006/11/10/14988.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Fri, 10 Nov 2006 15:43:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2006/11/10/14988.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/14988.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2006/11/10/14988.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/14988.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/14988.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&lt; 笔记一、数据类型 &gt; 现在业界普遍认可以下等式 程序 = 数据结构&nbsp;&nbsp; + 算法 + 文档 这第一篇笔记就只对以上提到的数据结构结合本人的理解展开做些总结。 &nbsp;类型 程序的输入输出的实体就是数据信息，而对这些数据信息给以归类和组织，我们就称为数据结构。因此数据结构就是对数据的组织形式，也可以说是对内存的编码规则。...&nbsp;&nbsp;<a href='http://www.cppblog.com/franksunny/archive/2006/11/10/14988.html'>阅读全文</a><img src ="http://www.cppblog.com/franksunny/aggbug/14988.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2006-11-10 23:43 <a href="http://www.cppblog.com/franksunny/archive/2006/11/10/14988.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>由一道面试题来看Struct的对界（再谈结构）</title><link>http://www.cppblog.com/franksunny/archive/2006/10/20/13925.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Fri, 20 Oct 2006 13:52:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2006/10/20/13925.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/13925.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2006/10/20/13925.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/13925.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/13925.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 由一道面试题来看 Struct 的对界 &nbsp; 本文节选自宋宝华的C/C++的struct深层探索一文，本人对其所描述的struct对齐比较喜欢，为此转来与大家分享，原文见http://blog.donews.com/21cnbao/archive/2005/09/08/544877.aspx &nbsp; Intel 、微软等公司曾经出过一道类似的面试题： 1. #in...&nbsp;&nbsp;<a href='http://www.cppblog.com/franksunny/archive/2006/10/20/13925.html'>阅读全文</a><img src ="http://www.cppblog.com/franksunny/aggbug/13925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2006-10-20 21:52 <a href="http://www.cppblog.com/franksunny/archive/2006/10/20/13925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++结构体的一个高级特性――指定成员的位数</title><link>http://www.cppblog.com/franksunny/archive/2006/10/20/13887.html</link><dc:creator>frank.sunny</dc:creator><author>frank.sunny</author><pubDate>Thu, 19 Oct 2006 16:05:00 GMT</pubDate><guid>http://www.cppblog.com/franksunny/archive/2006/10/20/13887.html</guid><wfw:comment>http://www.cppblog.com/franksunny/comments/13887.html</wfw:comment><comments>http://www.cppblog.com/franksunny/archive/2006/10/20/13887.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/franksunny/comments/commentRss/13887.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/franksunny/services/trackbacks/13887.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: C/C++														结构体的一个高级特性														――														指定成员的位数																																																																																						...&nbsp;&nbsp;<a href='http://www.cppblog.com/franksunny/archive/2006/10/20/13887.html'>阅读全文</a><img src ="http://www.cppblog.com/franksunny/aggbug/13887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/franksunny/" target="_blank">frank.sunny</a> 2006-10-20 00:05 <a href="http://www.cppblog.com/franksunny/archive/2006/10/20/13887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>