﻿<?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/2999.html</link><description>获得人生中的成功需要的专注与坚持不懈多过天才与机会。

                       ——C.W. Wendte</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 01:57:25 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 01:57:25 GMT</pubDate><ttl>60</ttl><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>17</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>也谈关于时间[转载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" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="10000000" UnitName="l">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" IsROCDate="False" IsLunarDate="False" Day="1" Month="1" Year="2007"><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" IsROCDate="False" IsLunarDate="False" Day="1" Month="1" Year="2007"><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" IsROCDate="False" IsLunarDate="False" Day="2" Month="1" Year="2007"><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" IsROCDate="False" IsLunarDate="False" Day="1" Month="1" Year="1970"><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" IsROCDate="False" IsLunarDate="False" Day="1" Month="1" Year="1970"><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" IsROCDate="False" IsLunarDate="False" Day="18" Month="1" Year="2038"><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" IsROCDate="False" IsLunarDate="False" Day="1" Month="1" Year="3001"><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" IsROCDate="False" IsLunarDate="False" Day="31" Month="12" Year="1899"><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" IsROCDate="False" IsLunarDate="False" Day="1" Month="1" Year="1970"><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" IsROCDate="False" IsLunarDate="False" Day="1" Month="1" Year="1970"><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" IsROCDate="False" IsLunarDate="False" Day="1" Month="1" Year="1970"><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" IsROCDate="False" IsLunarDate="False" Day="30" Month="7" Year="2005"><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" IsROCDate="False" IsLunarDate="False" Day="30" Month="7" Year="2005"><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" IsROCDate="False" IsLunarDate="False" Day="1" Month="7" Year="1997"><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" IsROCDate="False" IsLunarDate="False" Day="1" Month="1" Year="1970"><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>[转载]关于对齐和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 />    1. 成员的对齐是按声明顺序进行的；<br />    2. 对齐值由编译指示和最大成员两者较小的值决定；<br />    3. 未对齐到对齐值的成员一起形成块对齐（联合对齐）；<br />    4. 上一个（下一个）对齐采用自己较大则不变，自己较小则填充自己对齐到上一个（下一个）大小；<br />    5. 每成员对齐：如果前面已对齐到对齐值，下一个对齐自己。如果前面未对齐到对齐值，如果加上下一个成员不大于对齐值，下一个对齐自己，否则填充自己块对齐到对齐值。<br />    6. 最后还未对齐到对齐值的，填充空间块对齐到对齐值。<br /><br />从这些结论，可以得到：<br />    1. 以上的对齐原则其实是尽量整齐排列、尽量节省内存。<br />    2. 声明成员应该尽量避免不同类型错杂开来，最好采用从小到大或者从大到小的顺序（错开后，会因为上对齐和下对齐而增加填充开销）。<br />    3. 编译器缺省采用8字节对齐主要是因为最大基本类型为8自己（以前自己不明白，在论坛提过问，后来，以为是SSE指令的原因）。<br />    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></channel></rss>