﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-远风工作室-随笔分类-C/C++基础</title><link>http://www.cppblog.com/amazon/category/8956.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 01 Oct 2011 01:05:18 GMT</lastBuildDate><pubDate>Sat, 01 Oct 2011 01:05:18 GMT</pubDate><ttl>60</ttl><item><title>C/C++小结杂烩</title><link>http://www.cppblog.com/amazon/archive/2009/12/17/103405.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Thu, 17 Dec 2009 08:27:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/12/17/103405.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/103405.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/12/17/103405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/103405.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/103405.html</trackback:ping><description><![CDATA[<p><strong>1.define宏定义</strong><br><br>define中的#和##：<br>（1）#可以将define中的参数转化为字符串，例如：<br>#define PRINT(x) printf(#x &#8220; is %d&#8221;, x);<br>（2）##可以将define中的参数转化为某个标识符的一部分，例如：<br>int tmp_a = 23;<br>#define PRINT(x) printf(#x &#8220; is %d&#8221;, tmp_##x);<br><br>define的位置：<br>宏定义可以出现在所有函数外部或者某函数内部，遵循两个规则：<br>第一，&nbsp;内部定义覆盖外部定义。如果全局的宏定义与某内部宏定义重名时，VC6.0编译器会提示warning但不出错，且以内部宏定义为准。<br>第二，&nbsp;定义点后均可使用，不以函数内外划分作用域，仅以文本中出现位置前后划分。<br><br>define解析顺序：<br>#define f(a,b) a##b <br>#define g(a) #a <br>#define h(a) g(a) <br>void macrotest(void) <br>{ <br>printf("%s,",h(f(1,2))); <br>printf("%s\n",g(f(1,2))); <br>}<br>最后答案是：12, f(1,2)<br>分析：解析一个串从左至右，一遍之后再从头开始。所以h(f(1,2)) -&gt; g(f(1,2)) -&gt; g(12) -&gt; 12，而g(f(1,2)) -&gt; #(f(1,2)) -&gt; f(1,2)。<br><br>define的缺陷：<br>第一，&nbsp;对于所有的function-like macros，所有的参数都要括起来，以防止macros(a+b)的情况出现；而且要注意是否有类似macros(i++)的情况出现，防止在文本替换后i++执行多次。<br>第二，&nbsp;宏不做类型检查，而且预处理展开后消失于无形，编译出错了很难找到错误。<br>第三，&nbsp;使用宏后该&#8220;函数&#8221;不能取址，不能作为函数指针传递给另一个函数。<br>第四，&nbsp;一般使用inline函数代替宏函数，类似的，一般使用const变量代替宏变量。<br><br><strong>2.strncpy和strncat<br></strong><br>strncpy(dest, src, size);<br>使用strncpy(a, b, size)函数时，根据size值分两种情况：<br>第一，size比字符串b长度大时，将b字符串赋给a，再将a中size-b.length的多余位置赋值为\0。<br>第二，size比字符串b长度小时，将size长度的b子字符串赋给a，但不自动在后面添加\0。<br><br>strncat(dest, src, size);<br>使用strncat(a, b, size)函数时，根据size值分两种情况：<br>第一，size比字符串b长度大时，将b字符串赋给a第一个\0结束符处，并自动在右面添加\0，多余的size-b.length位置不赋值。<br>第二，size比字符串b长度小时，将size长度的字符串赋给a第一个\0结束符处，并且自动在后面添加\0。<br><br><strong>3.printf和scanf<br></strong><br>printf(&#8220;%x, %x, %x&#8221;, a, b, c);<br>printf注意事项：<br>第一， pirntf参数从右向左依次压栈。<br>第二，&nbsp;字符串%&#215;和后面参数从左至右依次映射，当参数多出时可忽略不计。<br>第三，&nbsp;字符串%&#215;和后面参数从左至右依次映射，当%&#215;多出时，打印出来的结果不可预测（因为VC下参数从右向左压栈，所以多出的%&#215;只能对应不可预知的内存）。<br><br><strong>其他</strong><br><br>4.rand()函数的最大取值是0X7fff，也就是2的15次方-1。<br><br>5.对于数组char a[100]，sizeof(a)的值是100，表示数组大小，而sizeof(&amp;a)按道理来说应该是4，表示指向数组a的指针的大小，但是某些MSVC版本对arrayName和&amp;arrayName是不区分的，需要安装sp1的MSVC的补丁才可去掉这个bug。<br><br>6.C语言中，不写返回类型的函数，一般默认为int型，而C++中必须指明返回类型。但在一般的编译器实现中，可能会做放宽处理，例如VC6.0中可以接受C++函数没有返回类型，默认为int。<br><br>7.返回值为数组指针<br>如果函数返回值是int(*)[NUM]类型，不可写成int(*)[NUM] func() {}的形式，而应该写成：<br><span style="COLOR: red">int (*func)() [NUM] {}</span><br>或者使用typedef来简化：<br><span style="COLOR: red">typedef int(*)[NUM] type;<br>type func() {}</span><br>那么，如何保存函数的返回值呢，具体如下：<br>int a[num1][NUM];<br>int (*b)[NUM] = &amp;a[num2];<br>b = func();<br><br>8.结构体<br>结构体有赋值操作，但是没有比较操作，可以重载==等这些比较运算符；同时，最好别用memcmp函数进行结构体的比较操作，因为要考虑到结构体的对齐问题，且填充的字节是随机的。<br><br>9.函数指针<br>void func() {}<br>printf(&#8220;%p&nbsp; %p&nbsp; %p&#8221;, func, &amp;func, *func);<br>其结果是一样的，原因在于：<br>函数名就是函数名，除了少量情况，它会退化为函数指针，即发生function-to-pointer转换。fun单独放着的时候就会发生退化，而在&amp;fun的情况下不会退化，所以单独的fun和&amp;fun的类型、值都一样。而*fun则是fun先发生退化，变成函数指针，*变成函数类型，然后再退化成函数指针，所以函数类型怎么*都一样。（maybe）<br><br>10.(int&amp;)a和(int)a的区别<br>(int&amp;)a不经过转换，直接得到a在内存单元的值；(int)a则是a在内存中的值转换成int类型，那么存在两种情况：<br>第一，&nbsp;a类型是int，此时(int&amp;)a和(int)a是相等的。<br>第二，&nbsp;a类型是float等，由于float在内存中存储的形式是符号位+指数+尾数，而阶码采用增码，为数采用源码，与int的存储形式不同。(int)a会先将内存中的值转换成int类型，然后给a，而(int&amp;)a则直接将内存中的值给a，不经过转换，所以此时两者不相等。<br><br></p>
<img src ="http://www.cppblog.com/amazon/aggbug/103405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-12-17 16:27 <a href="http://www.cppblog.com/amazon/archive/2009/12/17/103405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>32位系统中VC++可识别类型</title><link>http://www.cppblog.com/amazon/archive/2009/12/12/103073.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Sat, 12 Dec 2009 14:02:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/12/12/103073.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/103073.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/12/12/103073.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/103073.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/103073.html</trackback:ping><description><![CDATA[<p><strong>C/C++中类型：</strong><br><br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/amazon/type3.JPG" width=573 height=425></p>
<p><br><strong>windows中常用类型：<br></strong><br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/amazon/type1.JPG" width=576 height=420><br><br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/amazon/type2.JPG" width=587 height=586></p>
<br>
<img src ="http://www.cppblog.com/amazon/aggbug/103073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-12-12 22:02 <a href="http://www.cppblog.com/amazon/archive/2009/12/12/103073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用MessageBox进行多线程调试</title><link>http://www.cppblog.com/amazon/archive/2009/12/09/102851.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Wed, 09 Dec 2009 07:35:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/12/09/102851.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/102851.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/12/09/102851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/102851.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/102851.html</trackback:ping><description><![CDATA[<p style="MARGIN-RIGHT: 0px" dir=ltr>由于多线程的特点，无法像在单线程里一样使用单步跟踪和断点调试，在多线程或者窗口函数中可以使用MessageBox来调试，该函数定义为：<br>MessageBox(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);<br>其中：<br>HWND是窗口句柄，可以为NULL；<br>lpText是文本内容；<br>lpCaption是窗口标题；<br>uType是窗口类型，如MB_OK、MB_OKCANCEL、MB_YESNO、MB_YESNOCANCEL；<br>返回值是IDCANCEL、IDNO、IDOK、IDYES。<br>注意：LPCSTR和LPCWSTR在VC6.0中可以是char型的字符串，但是在VC2005下要改为char_t型的字符串，也就是使用_T(&#8220;&#8230;&#8230;&#8221;)的机制。<br><br>笔者在进行实验的时候，让线程cout输出或者messagebox输出，没有显示结果，代码如下：<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">DWORD&nbsp;WINAPI&nbsp;Func1(LPVOID&nbsp;param)<br><img id=Codehighlighter1_33_110_Open_Image onclick="this.style.display='none'; Codehighlighter1_33_110_Open_Text.style.display='none'; Codehighlighter1_33_110_Closed_Image.style.display='inline'; Codehighlighter1_33_110_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_33_110_Closed_Image onclick="this.style.display='none'; Codehighlighter1_33_110_Closed_Text.style.display='none'; Codehighlighter1_33_110_Open_Image.style.display='inline'; Codehighlighter1_33_110_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_33_110_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_33_110_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">MessageBox(NULL,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ddd</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;MB_OK);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_124_282_Open_Image onclick="this.style.display='none'; Codehighlighter1_124_282_Open_Text.style.display='none'; Codehighlighter1_124_282_Closed_Image.style.display='inline'; Codehighlighter1_124_282_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_124_282_Closed_Image onclick="this.style.display='none'; Codehighlighter1_124_282_Closed_Text.style.display='none'; Codehighlighter1_124_282_Open_Image.style.display='inline'; Codehighlighter1_124_282_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_124_282_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_124_282_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">HANDLE&nbsp;p;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">DWORD&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">DWORD&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CreateThread(NULL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;(LPTHREAD_START_ROUTINE)Func1,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">id);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">WaitForSingleObject(p,&nbsp;INFINITE);</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<p style="MARGIN-RIGHT: 0px" dir=ltr>后来查明具体原因为：主线程运行太快，导致程序在Func1线程打印语句之前就已经退出了。更正方法为在main中创建线程Func1后添加同步机制WaitForSingleObject(p, INFINITE)。<br></p>
<img src ="http://www.cppblog.com/amazon/aggbug/102851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-12-09 15:35 <a href="http://www.cppblog.com/amazon/archive/2009/12/09/102851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>const在C和C++中的不同</title><link>http://www.cppblog.com/amazon/archive/2009/12/09/102850.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Wed, 09 Dec 2009 07:14:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/12/09/102850.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/102850.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/12/09/102850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/102850.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/102850.html</trackback:ping><description><![CDATA[根据笔者的归纳，主要有以下三点：<br><br>（1）C++能够把已用常量赋值（必须是常量赋值而不是函数赋值等）的const变量看作编译期常数，而C没有这种功能。<br>const int BUFSIZE = 1024;&nbsp;&nbsp;&nbsp; //必须是常量赋值<br>char buf[BUFSIZE];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //C++中允许<br><br>（2）C++默认const变量的链接性质是内部的，而C则默认是外部的。在C++中必须使用extern声明a，a才能在其他文件使用。<br>const int a = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //C++中不可以在其他文件中使用，C可以<br>extern const int a = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //C++中可以在其他文件中使用<br><br>（3）C只能允许常量初始化const外部变量，但是C++中没有限制，如：<br>int f(void);<br>const int a = f();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //C++允许<br><br><br>
<img src ="http://www.cppblog.com/amazon/aggbug/102850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-12-09 15:14 <a href="http://www.cppblog.com/amazon/archive/2009/12/09/102850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据存储类型：auto/static/register/extern</title><link>http://www.cppblog.com/amazon/archive/2009/12/09/102847.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Wed, 09 Dec 2009 07:02:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/12/09/102847.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/102847.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/12/09/102847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/102847.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/102847.html</trackback:ping><description><![CDATA[在c语言中，每个变量和函数有两个属性：数据类型和数据的存储类别。下面简要讲述四种数据存储类型。<br><br><strong>auto变量：</strong><br>函数中的局部变量，如不专门声明为static存储类别，都是动态地分配存储空间的，数据存储在动态存储区中。函数中的形参和在函数中定义的变量（包括在复合语句中定义的变量），都属此类，在调用该函数时系统会给它们分配存储空间，在函数调用结束时就自动释放这些存储空间。这类局部变量称为自动变量。自动变量用关键字auto作存储类别的声明。关键字auto可以省略，auto不写则隐含定为&#8220;自动存储类别&#8221;，属于动态存储方式。<br>注意：<br>（1）使用auto修饰全局变量编译无法通过。<br><br><strong>static局部变量：</strong><br>有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值，这时就应该指定局部变量为&#8220;静态局部变量&#8221;，用关键字static进行声明。<br>说明：<br>（1）静态局部变量属于静态存储类别，在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量（即动态局部变量）属于动态存储类别，占动态存储空间，函数调用结束后即释放。<br>（2）静态局部变量在编译时赋初值，即只赋初值一次；而对自动变量赋初值是在函数调用时进行，每调用一次函数重新给一次初值，相当于执行一次赋值语句。<br>（3）如果在定义局部变量时不赋初值的话，则对静态局部变量来说，编译时自动赋初值0（对数值型变量）或空字符（对字符变量）。而对自动变量来说，如果不赋初值则它的值是一个不确定的值。<br><br><strong>register变量：<br></strong>为了提高效率，C语言允许将局部变量的值放在CPU中的寄存器中，这种变量叫&#8220;寄存器变量&#8221;，用关键字register作声明。<br>说明：<br>（1）只有局部自动变量和形式参数可以作为寄存器变量，否则无法编译；<br>（2）一个计算机系统中的寄存器数目有限，不能定义任意多个寄存器变量；<br>（3）局部静态变量不能定义为寄存器变量。<br><br><strong>extern外部变量：<br></strong>外部变量（即全局变量）是在函数的外部定义的，它的作用域为从变量定义处开始，到本程序文件的末尾。如果外部变量不在文件的开头定义，其有效的作用范围只限于定义处到文件终了。如果在定义点之前的函数想引用该外部变量，则应该在引用之前用关键字extern对该变量作&#8220;外部变量声明&#8221;。表示该变量是一个已经定义的外部变量。有了此声明，就可以从&#8220;声明&#8221;处起，合法地使用该外部变量。<br>说明：<br>（1）用extern修饰局部变量编译出错，显示&#8220;重定义&#8221;。<br>（2）全局变量中，带有初始化的语句是定义（int a = 1;），带有extern的语句是声明（extern int a;），除非是对变量进行初始化（extern int b = 2;）。<br><br>
<img src ="http://www.cppblog.com/amazon/aggbug/102847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-12-09 15:02 <a href="http://www.cppblog.com/amazon/archive/2009/12/09/102847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>string用法总结</title><link>http://www.cppblog.com/amazon/archive/2009/10/18/92951.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Sun, 18 Oct 2009 13:29:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/10/18/92951.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/92951.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/10/18/92951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/92951.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/92951.html</trackback:ping><description><![CDATA[<p><strong>1.头文件包含：</strong><br>一般来说使用string需要包含#include &lt;string&gt;头文件，但是下面的程序没有包含string头文件却能运行：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_54_194_Open_Image onclick="this.style.display='none'; Codehighlighter1_54_194_Open_Text.style.display='none'; Codehighlighter1_54_194_Closed_Image.style.display='inline'; Codehighlighter1_54_194_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_54_194_Closed_Image onclick="this.style.display='none'; Codehighlighter1_54_194_Closed_Text.style.display='none'; Codehighlighter1_54_194_Open_Image.style.display='inline'; Codehighlighter1_54_194_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_54_194_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_54_194_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;str(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">fdsfsdaf</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;str.c_str();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">str.c_str()可以运行<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">cout&nbsp;&lt;&lt;&nbsp;str;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">str无法运行</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p><span style="COLOR: red">不包含string头文件时，cout&lt;&lt;str无法运行；当重新包含string头文件后，cout&lt;&lt;str运行成功。为什么？？？</span><br>初步设想：iostream头文件间接导入了string头文件，但是相当一部分的string操作定义在string头文件中，例如程序中的&lt;&lt;操作符重载，不包含string头文件的话无法使用。所以建议编程时还是主动导入string头文件。<br><br><strong>2.string类型声明：</strong><br>string s;<br>string s(args);<br>其中args具体参数如下：<br>str<br>str, len<br>chars<br>chars, len<br>chars, index, len<br>n, c<br>b, e<br><br><span style="COLOR: red">注意：对string的操作，既可以用迭代器，也可以用下标，它比容器具有更多的灵活性。以下使用b、e和p表示迭代器，pos表示下标，cp表示指向c类字符串的指针。</span><br><br><strong>3.string操作：</strong><br>=、assign()：<br>对string对象赋以新值。=右边可以是string类型、c_string类型甚至是'a'这样的单一字符。使用assign()可以更灵活的对string进行赋值，例如：<br>args具体参数如下：<br>str<br>str, len<br>chars<br>chars, len<br>chars, index, len<br>n, c<br>b, e<br><br>swap()：<br>交换两个字符串的内容，例如s1.swap(s2)，注意里面不可以是c_string类型。<br><br>+=、append(args)、push_back()：<br>在尾部添加字符。+=后面可以是string、c_string甚至是'a'这样的单一字符。其中args具体参数如下：<br>str<br>str, len<br>chars<br>chars, len<br>chars, index, len<br>n, c<br>b, e<br>s.push_back('x')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//用于每次增加一个字符。<br><br>insert()：<br>在string某个位置插入字符，插入位置在给定的索引处。例如s.insert(4, str)。注意，这种形式的insert()函数不支持传入单个字符，要想传入单个字符必须写成字符串的形式。<br>s.insert(p, t)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //在p前插入元素t<br>s.insert(p, n, t)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //在p前插入n个t<br>s.insert(p, b, e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //b和e是迭代器<br>s.insert(pos, args)<br>其中args具体参数如下：<br>str<br>str, len<br>chars<br>chars, len<br>chars, index, len<br>n, c<br>b, e<br><br>erase()：删除字符。<br>s.erase(p)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //删除p指向的元素，返回指向该元素后面元素的迭代器<br>s.erase(b, e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //删除b和e间的元素，返回指向该元素后面元素的迭代器<br>s.erase(pos, len)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //删除pos下标开始的len个字符<br><br>clear()：<br>清空字符，例如s.clear()，效果等同于s=""，但是内部机制是否一样未知。<br><br>replace()：替换字符。<br>s.replace(pos, args)<br>其中args具体参数如下：<br>str<br>str, len<br>chars<br>chars, len<br>chars, index, len<br>n, c<br>b, e<br>同理把前两个参数换成b和e也可以。<br><br>+：<br>串联字符串。<br><br>==、!=、&lt;、&lt;=、&gt;、&gt;=、compare()：<br>比较字符串，可以在string与string、string与c_string间进行比较，例如str1 &lt; str2，s &lt;= "abc"。compare()函数支持多参数处理，支持用索引值和长度定位子串来进行比较，返回0表示相等，正数表示大于，负数表示小于，例如：<br>s.compare("abcd")<br>s.compare(s2)<br>s.compare(pos, len, s2)<br>s.compare(pos1, len1, s2, pos2, len2)<br>s.compare(pos, len, "....")<br>s.compare(pos1, len2, "....", pos2, len2)<br><br>size()、length()：<br>返回字符数量，两者等效。<br>empty()：<br>判断字符串是否为空。<br>max_size()：<br>返回字符的可能最大个数，很可能和机器本身的限制或者字符串所在位置连续内存的大小有关系。<br>capacity()：<br>返回重新分配前的字符容量。<br>reserve()：<br>重置字符容量。<br><br>[]、at()：<br>存取单一字符，不同点在于at()会检查索引是否有效，即是否超出0～s.length()-1的范围，如果超出会抛出out_of_range的异常。<br><br>&gt;&gt;、getline()：<br>从stream中读取某值，其中getline()是读取一行，直到遇到分行符或者文件结尾符。<br>&lt;&lt;：<br>将某值写入stream。<br><br>copy()：<br>将某string写入一个既有的c_string中，例如s.copy(chars, s.size())，得到的字符串<span style="COLOR: red">不以"\0"结尾</span>，需要注意这点。<br>c_str()：<br>函数原型是const char* c_str() const{}，例如s.c_str()将返回一个const char*类型，且以"\0"结尾。<br>data()：<br>函数原型是const char* data() const{}，例如s.data()返回一个const char*类型，与c_str()不同的是它返回的字符串不以"\0"结尾。<br><br>substr()：<br>返回某个子字符串。<br>s.substr()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回s的全部内容<br>s.substr(pos)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //从pos下标开始的所有字符<br>s.substr(pos, len)&nbsp;&nbsp;&nbsp;&nbsp; //从索引pos开始的len个字符。<br><br>begin()、end()：<br>提供类似STL的迭代器支持。<br>rbegin()、rend()：<br>逆向迭代器。<br>get_allocator()：返回配置器。<br><br>查找函数：<br>find<br>rfind<br>find_first_of<br>find_last_of<br>find_first_not_of<br>find_last_not_of<br>参数1是被搜寻的对象，参数2指出搜寻起点索引（可无），参数3指出搜寻的字符个数（可无），返回值是索引值，类型是string::size_type，如果没有找到目标，返回string::npos。注意：string::npos的类型是string::size_type，并不是int而是unsigned int。<br>参数如下：<br>c, pos&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //从pos下标开始查找字符c，pos可默认为0<br>s2, pos&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //从pos开始查找string类型s2，pos可默认为0<br>cp, pos&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //从pos开始查找字符串cp，pos可默认为0<br>cp, pos,&nbsp;len&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查找cp前n个字符，pos和len不可默认<br></p>
<img src ="http://www.cppblog.com/amazon/aggbug/92951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-10-18 21:29 <a href="http://www.cppblog.com/amazon/archive/2009/10/18/92951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>类的特殊大小情况</title><link>http://www.cppblog.com/amazon/archive/2009/10/17/98840.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Sat, 17 Oct 2009 11:02:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/10/17/98840.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/98840.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/10/17/98840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/98840.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/98840.html</trackback:ping><description><![CDATA[现对某些特殊情况的类的大小做总结：<br>1.空类<br>2.带有虚函数的类<br>3.继承父类的子类<br>4.带有static成员的类<br>5.普通类<br><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;A&nbsp;<br><img id=Codehighlighter1_9_11_Open_Image onclick="this.style.display='none'; Codehighlighter1_9_11_Open_Text.style.display='none'; Codehighlighter1_9_11_Closed_Image.style.display='inline'; Codehighlighter1_9_11_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_9_11_Closed_Image onclick="this.style.display='none'; Codehighlighter1_9_11_Closed_Text.style.display='none'; Codehighlighter1_9_11_Open_Image.style.display='inline'; Codehighlighter1_9_11_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_9_11_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_9_11_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">结果：sizeof(A)=1<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">原因：空类并不是什么都没有，而是隐含插入了一个字节作为地址偏移量。如果空类长度为0，那创建n个类实例时会出现这些实例都在同一位置的问题。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;A&nbsp;<br><img id=Codehighlighter1_112_150_Open_Image onclick="this.style.display='none'; Codehighlighter1_112_150_Open_Text.style.display='none'; Codehighlighter1_112_150_Closed_Image.style.display='inline'; Codehighlighter1_112_150_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_112_150_Closed_Image onclick="this.style.display='none'; Codehighlighter1_112_150_Closed_Text.style.display='none'; Codehighlighter1_112_150_Open_Image.style.display='inline'; Codehighlighter1_112_150_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_112_150_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_112_150_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;func()&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">结果：sizeof(A)=8<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">原因：如果类中有纯虚函数或者虚函数，那么有一个指向虚函数的指针，该指针大小为4个字节。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;A&nbsp;<br><img id=Codehighlighter1_226_228_Open_Image onclick="this.style.display='none'; Codehighlighter1_226_228_Open_Text.style.display='none'; Codehighlighter1_226_228_Closed_Image.style.display='inline'; Codehighlighter1_226_228_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_226_228_Closed_Image onclick="this.style.display='none'; Codehighlighter1_226_228_Closed_Text.style.display='none'; Codehighlighter1_226_228_Open_Image.style.display='inline'; Codehighlighter1_226_228_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_226_228_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_226_228_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;B&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;A<br><img id=Codehighlighter1_250_258_Open_Image onclick="this.style.display='none'; Codehighlighter1_250_258_Open_Text.style.display='none'; Codehighlighter1_250_258_Closed_Image.style.display='inline'; Codehighlighter1_250_258_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_250_258_Closed_Image onclick="this.style.display='none'; Codehighlighter1_250_258_Closed_Text.style.display='none'; Codehighlighter1_250_258_Open_Image.style.display='inline'; Codehighlighter1_250_258_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_250_258_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_250_258_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">添加</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">结果：&#8220;添加&#8221;处没有任何语句，sizeof(B)=1；添加int&nbsp;a，sizeof(B)=4。<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">原因：和非继承的情况一样。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;A&nbsp;<br><img id=Codehighlighter1_337_339_Open_Image onclick="this.style.display='none'; Codehighlighter1_337_339_Open_Text.style.display='none'; Codehighlighter1_337_339_Closed_Image.style.display='inline'; Codehighlighter1_337_339_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_337_339_Closed_Image onclick="this.style.display='none'; Codehighlighter1_337_339_Closed_Text.style.display='none'; Codehighlighter1_337_339_Open_Image.style.display='inline'; Codehighlighter1_337_339_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_337_339_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_337_339_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;B<br><img id=Codehighlighter1_350_352_Open_Image onclick="this.style.display='none'; Codehighlighter1_350_352_Open_Text.style.display='none'; Codehighlighter1_350_352_Closed_Image.style.display='inline'; Codehighlighter1_350_352_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_350_352_Closed_Image onclick="this.style.display='none'; Codehighlighter1_350_352_Closed_Text.style.display='none'; Codehighlighter1_350_352_Open_Image.style.display='inline'; Codehighlighter1_350_352_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_350_352_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_350_352_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;C&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;B,&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;A<br><img id=Codehighlighter1_384_392_Open_Image onclick="this.style.display='none'; Codehighlighter1_384_392_Open_Text.style.display='none'; Codehighlighter1_384_392_Closed_Image.style.display='inline'; Codehighlighter1_384_392_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_384_392_Closed_Image onclick="this.style.display='none'; Codehighlighter1_384_392_Closed_Text.style.display='none'; Codehighlighter1_384_392_Open_Image.style.display='inline'; Codehighlighter1_384_392_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_384_392_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_384_392_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">添加</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">结果：&#8220;添加&#8221;处中不加任何语句，sizeof(C)=1；添加int&nbsp;a，sizeof(C)=18；添加char&nbsp;a，sizeof(C)=12；添加short，sizeof(C)=14。<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">原因：不添加任何语句的那1个字节是偏移量，而添加其他变量后因为对齐的原因（和结构体相同），所以出现这种结果。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;A&nbsp;<br><img id=Codehighlighter1_557_582_Open_Image onclick="this.style.display='none'; Codehighlighter1_557_582_Open_Text.style.display='none'; Codehighlighter1_557_582_Closed_Image.style.display='inline'; Codehighlighter1_557_582_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_557_582_Closed_Image onclick="this.style.display='none'; Codehighlighter1_557_582_Closed_Text.style.display='none'; Codehighlighter1_557_582_Open_Image.style.display='inline'; Codehighlighter1_557_582_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_557_582_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_557_582_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">结果：sizeof(A)=4<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">原因：类的静态数据成员放在全局静态存储区中，不影响类的大小。而类的非静态数据成员只有被实例化的时候，他们才存在。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;A&nbsp;<br><img id=Codehighlighter1_671_713_Open_Image onclick="this.style.display='none'; Codehighlighter1_671_713_Open_Text.style.display='none'; Codehighlighter1_671_713_Closed_Image.style.display='inline'; Codehighlighter1_671_713_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_671_713_Closed_Image onclick="this.style.display='none'; Codehighlighter1_671_713_Closed_Text.style.display='none'; Codehighlighter1_671_713_Open_Image.style.display='inline'; Codehighlighter1_671_713_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_671_713_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_671_713_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_677_678_Open_Image onclick="this.style.display='none'; Codehighlighter1_677_678_Open_Text.style.display='none'; Codehighlighter1_677_678_Closed_Image.style.display='inline'; Codehighlighter1_677_678_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_677_678_Closed_Image onclick="this.style.display='none'; Codehighlighter1_677_678_Closed_Text.style.display='none'; Codehighlighter1_677_678_Open_Image.style.display='inline'; Codehighlighter1_677_678_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;A()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_677_678_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_677_678_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_686_687_Open_Image onclick="this.style.display='none'; Codehighlighter1_686_687_Open_Text.style.display='none'; Codehighlighter1_686_687_Closed_Image.style.display='inline'; Codehighlighter1_686_687_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_686_687_Closed_Image onclick="this.style.display='none'; Codehighlighter1_686_687_Closed_Text.style.display='none'; Codehighlighter1_686_687_Open_Image.style.display='inline'; Codehighlighter1_686_687_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">A()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_686_687_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_686_687_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_701_702_Open_Image onclick="this.style.display='none'; Codehighlighter1_701_702_Open_Text.style.display='none'; Codehighlighter1_701_702_Closed_Image.style.display='inline'; Codehighlighter1_701_702_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_701_702_Closed_Image onclick="this.style.display='none'; Codehighlighter1_701_702_Closed_Text.style.display='none'; Codehighlighter1_701_702_Open_Image.style.display='inline'; Codehighlighter1_701_702_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Func()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_701_702_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_701_702_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">结果：sizeof(A)=4<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">原因：类的大小与它当中的构造函数，析构函数，以及其他的成员函数无关（纯虚函数除外），只与它当中的成员数据有关。</span></div>
<br>从以上的几个例子不难发现类的大小：<br><span style="COLOR: red">1.为类的非静态成员数据的类型大小之和<br>2.有编译器额外加入的成员变量的大小，用来支持语言的某些特性（如：指向虚函数的指针）<br>3.为了优化存取效率，进行的边缘调整<br>4.与类中的构造函数，析构函数以及其他的成员函数无关<br><br></span>
<img src ="http://www.cppblog.com/amazon/aggbug/98840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-10-17 19:02 <a href="http://www.cppblog.com/amazon/archive/2009/10/17/98840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用Win IDE库函数</title><link>http://www.cppblog.com/amazon/archive/2009/10/11/98310.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Sun, 11 Oct 2009 07:07:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/10/11/98310.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/98310.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/10/11/98310.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/98310.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/98310.html</trackback:ping><description><![CDATA[<p><strong>注意：资料来源较早，以下使用float类型的函数参数目前已经全部改为double。<br><br><br>数学函数：</strong></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">math.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;abs(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;fabs(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;sin(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;asin(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">x&nbsp;in&nbsp;[-1.0,&nbsp;1.0]</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;cos(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;acos(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">x&nbsp;in&nbsp;[-1.0,&nbsp;1.0]</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;tan(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;atan(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;atan2(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x,&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;y);&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">求x/y的反正切值</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;sinh(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">求x的双曲正弦值，(e^x&nbsp;&#8211;&nbsp;e^(-x))&nbsp;/&nbsp;2</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;cosh(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">求x的双曲余弦值，(e^x&nbsp;+&nbsp;e^(-x)&nbsp;/&nbsp;2)</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;tanh(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">求x的双曲正切值，(e^x&nbsp;&#8211;&nbsp;e^(-x))&nbsp;/&nbsp;(e^x&nbsp;+&nbsp;e^(-x))</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;ceil(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;floor(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;exp(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;fmod(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x,&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;y);&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">求x/y的余数，x&nbsp;&#8211;&nbsp;x&nbsp;/&nbsp;y</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;frexp(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">exp);&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">把x分解成尾数和2的指数，返回数是尾数，exp是指数</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;ldexp(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;exp);&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">转载浮点数，返回x*2^exp的值</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;modf(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x,&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">i);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将x分解成整数和小数，返回值是小数部分，i是整数部分</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;hypot(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x,&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;y);&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">根据勾股定理返回斜边</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;log(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">x&nbsp;&gt;&nbsp;0</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;log10(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">x&nbsp;&gt;&nbsp;0</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;pow(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x,&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;y);&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">x&nbsp;&gt;&nbsp;0</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;sqrt(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;x);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">x&nbsp;&gt;&nbsp;0</span></div>
<p><br><br><strong>字符函数：</strong></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ctype.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;isalnum(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">判断是否为0-9、a-z、A-z中的字符</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;isalpha(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;isaldigit(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iscntrl(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">判断c是否为控制字符，0X00-0X1F之间或0X7F（DEL）</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;islower(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;isupper(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;isascii(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">判断是否为ASCII码，指0X00-0X7F之间的字符</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;isgraph(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">c是否为除空格之外的可打印字符，指0X21-0X7E</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;isprint(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">c是否为可打印字符，包含空格，指0x20-0x7E</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ispunct(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">c是否为标点符号，指非字符数字，非空格的可打印字符</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;isspace(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">空白符指空格、制表符、换页符、回车符、换行符</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;isxdigit(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">是否16进制数字，指0-9、A-F、a-f之间的字符</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;toascii(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将c转换成ascii码，即高位清零，仅保留低7位</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;tolower(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;toupper(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);</span></div>
<p><br><br><strong>动态内存分配：</strong></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdlib.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">malloc(unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num_bytes);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">realloc(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">mem_address,&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;newsize);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">alloc(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num_elems,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;elem_size);</span></div>
<p><br><br><strong>字符串函数：</strong></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">memchr(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buf,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;ch,&nbsp;unsigned&nbsp;count);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在buf所指内存前count个字节查找字符ch，返回指向ch的指针或NULL</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;memcmp(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buf1,&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buf2,&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;count);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">比较buf1和buf2的前count个字节，&lt;&nbsp;=&nbsp;&gt;&nbsp;分别返回&nbsp;&lt;0&nbsp;=0&nbsp;&gt;0</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;memicmp(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buf1,&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buf2,&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;count);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">比较buf1和buf2的前count个字节，但不区分字母大小写</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">memccpy(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dest,&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">src,&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;ch,&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;count);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从src中复制不多于count个字节到dest，遇到字符ch则停止复制。返回指向ch后的第一个字符的指针，没有遇到ch则返回NULL，注意ch也被复制</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">memcpy(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dest,&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">src,&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;count);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从src中复制不多于count个字节到dest，返回指向dest的指针，注意dest和src不能重叠</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">memmove(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dest,&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">src,&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;count);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从src中复制不多于count个字节到dest，返回指向dest的指针，其中dest和src所指内存区域可以重叠，但是src内容会被更改</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">memeset(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">buffer,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;count);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将buffer所指区域前count个字节设置成c字符，返回buffer指针<br><br>&nbsp;&nbsp;&nbsp;//&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;<br>&nbsp;&nbsp;&nbsp;//分界线<br></span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;//&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strcpy(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dest,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">src);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;src所有字符串复制到dest中，两者区域不可重叠，且dest必须要有足够空间，返回dest指针</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strncpy(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dest,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">src,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;src前n个字符复制到dest中，两者区域不可重叠，且dest必须要有足够空间，返回dest指针。如果src前n个字符不含"\0"，则dest不以"\0"结束；如果src长度小于n，则用"\0"填充dest直到n个字节复制完毕</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strdup(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">函数内malloc()分配空间，返回指向被复制的字符串的指针，需要在函数中人工free掉分配的空间<br></span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strcat(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dest,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">src);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">联接dest和src，dest改变，两者区域不可重叠，且dest必须要有足够空间，返回dest指针</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strncat(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dest,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">src,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">联接dest和src前n个字符，两者区域不可重叠，且dest必须要有足够空间，返回dest指针<br></span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;strcmp(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s1,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s2);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">比较s1和s2，&lt;&nbsp;=&nbsp;&gt;&nbsp;分别为&nbsp;&lt;0&nbsp;=0&nbsp;&gt;0</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;strncmp(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s1,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s2,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">比较s1和s2前n个字符，同上</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;stricmp(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s1,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s2);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">比较s1和s2，不区分字符大小写</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;strnicmp(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s1,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s2,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">比较s1和s2前n个字符，不区分字符大小写<br><br><span style="COLOR: #0000ff">&nbsp;&nbsp;&nbsp;char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strchr(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;c);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">查找s中c的首次出现位置，返回c位置指针或者NULL</span></span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;strcspn(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s1,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s2);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在s1中搜索s2中出现的字符，返回第一个出现在s1中的下标值，亦即在s1中出现而s2中没有出现的字符串长度</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strpbrk(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s1,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s2);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">在s1中搜索s2中出现的字符，返回第一个出现在s1中的字符指针或者NULL<br><span style="COLOR: #0000ff">&nbsp;&nbsp;&nbsp;char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strstr(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">haystack,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">needle);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从haystack中寻找needle第一次出现的位置，返回第一次出现的位置指针或者NULL</span><br></span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;strlen(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">返回s的长度，不包括结束符NULL</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strlwr(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将s转换为小写字母形式，返回指向s的指针</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strupr(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将s转换为大写字母形式，返回指向s的指针</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strrev(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将s的所有字符顺序颠倒过来，不包括&#8220;\0&#8221;，返回s指针</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">strset(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;c);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">将s的字符设置成字符c（"\0"不变），返回s的指针</span></div>
<p>&nbsp;<br></p>
<img src ="http://www.cppblog.com/amazon/aggbug/98310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-10-11 15:07 <a href="http://www.cppblog.com/amazon/archive/2009/10/11/98310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++小结杂烩</title><link>http://www.cppblog.com/amazon/archive/2009/09/21/96848.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 21 Sep 2009 06:38:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/09/21/96848.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/96848.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/09/21/96848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/96848.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/96848.html</trackback:ping><description><![CDATA[<p>1.获得随机数的方法：<br>rand()函数用来生成随机数，但严格意义上来说只是生成了伪随机数。在使用默认种子不变的情况下，如果在程序内循环，那么下一次生成随机数时会调用上一次rand()的结果作为种子。但是使用默认种子不变的情况下，每次执行程序得到的随机数都是相同的。<br>此时可使用srand()来指定种子数，通常用当前时间作为种子：srand(time(0))。具体情况如下：<br>#include &lt;cstdlib&gt;<br>#include &lt;ctime&gt;<br>srand(time(0));<br>while(1)<br>{<br>result = rand() % 100;<br>}<br>注意：千万不能把srand()写入循环当中，否则得出的随机数与当前时间有关，同一秒内的随机数是相同的。<br><br>2.位域（位段）<br>位域是一种数据结构，所谓位域是把一个字节中的二进位划分为几个不同的区域，并说明每个区域的为数；每个域有一个域名，允许在程序中按域名进行操作。如此一来，就能把几个不同对象用一个字节的二进制位域来表示。<br>struct 位域结构名<br>{ 类型说明符 位域名：位域长度; };<br>（1）一个位域必须存储在同一个字节中，不能跨两个字节。如一个字节所剩空间不够存放另一位域时，应从下一单元起存放该位域；当然也可以有意使某位域从下一单元开始。<br>struct bs<br>{<br>　　unsigned a:4;<br>　　unsigned :0;&nbsp;&nbsp;&nbsp; /*空域*/<br>　　unsigned b:4;&nbsp;&nbsp; /*从下一单元开始存放*/<br>　　unsigned c:4;<br>};<br>（2）位域的长度不能大于一个字节的长度，即不能超过8位。<br>（3）位域可以无位域名，这时它只用来填充或者调整位置，例如：<br>struct k<br>{<br>　　int a:1;<br>　　int :2;&nbsp;&nbsp;&nbsp;&nbsp; /*该2位不能使用*/<br>　　int b:3;<br>　　int c:2;<br>};<br>位域的使用方法和结构相同，没有什么区别。<br>注意：对于位域的对齐方式，和结构类似。比如int a : 4，首先会给int类型分配4个字节，然后将高4位分给a，如果a前后变量也是int，可以合用这4个字节（除非已经超出4个字节的范围）。最终整个位段结构也要根据最大长度的类型来对齐。<br><br>3.6种位运算符<br>&amp;&nbsp; 按位与 <br>|&nbsp;&nbsp; 按位或 <br>^&nbsp; 按位异或 <br>~&nbsp; 取反&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //不会改变原值<br>&lt;&lt; 左移&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //不会改变原值<br>&gt;&gt; 右移&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //不会改变原值<br><br>4.数值分为整型和实型，整型就是不带小数位的数，例如char、int等，实型则是指带小数位的数，也称浮点数，例如double、float等。<br><br>5.左值和右值<br>凡是可以被赋值的表达式，就叫左值，左值总是直接的或间接的变量（返回引用类型的函数也可以作为左值）。<br>凡是可以赋值给左值的，就叫右值，右值可以是变量、常量、函数调用等。<br>所有的左值都是右值，反之不见得。<br>注意：并不是左值就是可以赋值的值。可以被赋值的左值称为modifiable l-values，不可赋值的左值称为nonmodifiable l-values，包括有：<br>const int i=3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //i是左值，但是不可能被赋值<br>int a[10];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //a不可能被赋值<br>struct Node a;&nbsp;&nbsp; //一个struct或者union中包含const，不可赋值<br>++a=20;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //a是一个变量，可被程序寻址，可以改变它的值<br><span style="COLOR: red">a++=20;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //a++是一个引用了临时对象的表达式，所以是右值<br></span>a+5=20;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //a+5也是引用了临时对象的表达式，不能寻址该对象，是右值<br><br>6.sizeof求长度<br>32位系统中，对于char a[10]这样的数组来说，sizeof(a)的值为10；对于char *p=&#8220;12345&#8221;这样的指针来说，sizeof(p)的值为4，要求p指向的字符串长度，需要用strlen函数。<br>对于char *p=malloc(100)这样的指针来说，sizeof(p)的值为4，要求分配内存的大小，需要用到_msize函数，<span style="COLOR: red">size_t&nbsp; _msize(void *)在#include &lt;malloc.h&gt;中</span>。<br>对于函数总void Function(char a[100])，相当于void Function(char *a)，所以sizeof(a)的值为4。<br><br>7.局部变量能和全局变量重名，则局部变量屏蔽全局变量。需要使用全局变量时使用"::"符号。&#8220;::&#8221;表示全局有效域。<br><br>8.<br>main()<br>{<br>　　 char *c1 = "abc";<br>　　 char c2[] = "abc";<br>　　 char *c3 = ( char* )malloc(3);<br>　　 c3 = "abc";<br>　　 printf("%d %d %s\n",&amp;c1,c1,c1);<br>　　 printf("%d %d %s\n",&amp;c2,c2,c2);<br>　　 printf("%d %d %s\n",&amp;c3,c3,c3);<br>　　 getchar();<br>}<br>运行结果<br>　　 2293628 4199056 abc<br>　　 2293624 2293624 abc<br>　　 2293620 4199056 abc<br>分析：<br>char *c1 = "abc"中的字符串是常量字符串，存储在常量区中；char c2[] = "abc"的字符串存储在栈中；char *c3 = ( char* )malloc(3)存储在堆中；c3 = "abc"使得c3指向新的常量字符串，而不是对动态申请的内存进行更新；同时，c1，c2，c3这三个变量都是局部变量，只不过存储的是指向的内存地址，占4个字节的长度。<br>&amp;c2和c2指向同一个地址，只不过&amp;c2指向的是char[3]数组类型，c2指向的是char类型；c1和c3指向同一个地址，因为c3指向新的字符串，而且经过编译器优化后，与c1指向同一个字符串。<br>&amp;c1、&amp;c2、&amp;c3的值分别为2293620、2293624、2293628，这是因为指针c1和c2占了4个字节的长度，而c2指向的数组恰好也占了4个字节的长度。<br><br>9.结构体对齐问题<br>结构体中成员对齐的条件是：<br>（1）每个成员按照自己的方式对齐，对齐规则是每个成员按照类型的大小和对齐参数（默认是8字节）中较小的一个来对齐；<br>（2）整体结构的默认对齐方式是按照最长的成员和对齐参数中较小的那个来对齐。<br>（3）总的来说，对齐方式无非是1、2、4、8、16&#8230;&#8230;等。<br>设置对齐的预编译命令是：<br>#pragma pack(1)<br>其中pack()中的数字表示对齐参数（字节数），不写表示默认为8字节。<br>struct{<br>short a1;<br>short a2;<br>short a3;<br>}A;&nbsp;<br>//sizeof(A) = 6<br>struct{<br>long a1;<br>short a2;<br>}B;<br>//sizeof(B) = 8<br>#pragma pack(8)<br>struct S1{<br>&nbsp;&nbsp;&nbsp; char a;<br>&nbsp;&nbsp;&nbsp; long b;<br>};<br>struct S2 {<br>&nbsp;&nbsp;&nbsp; char c;<br>&nbsp;&nbsp;&nbsp; struct S1 d;<br>&nbsp;&nbsp;&nbsp; long long e;<br>};<br>//sizeof(S2) = 24<br>#pragma pack(1)<br>struct{<br>short a1;<br>short a2;<br>short a3;<br>}A;<br>//sizeof(A) = 6<br>struct{<br>long a1;<br>short a2;<br>}B;<br>#pragma pack(pop)&nbsp; <br>//sizeof(B) = 6<br><br>10.<br>静态定义的变量对象称为有名对象；动态定义的变量对象称为无名对象。<br>动态定义的对象初始化：需要使用初始化式显示初始化，且动态定义的类型数组不能初始化。<br>动态建立类数组时，必须要有缺省的构造函数，因为数组不可添加初始化式。<br><br>11.memcpy / memmove / strstr / strcpy<br>函数原型：void *memmove(void *dest, const void *source, size_t count)<br>返回值说明：返回指向dest的void *指针<br>参数说明：dest,source分别为目标串和源串的首地址。count为要移动的字符的个数<br>函数说明：memmove用于从source拷贝count个字符到dest，如果目标区域和源区域有重叠的话，memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。</p>
<p>函数原型：void *memcpy(void *dest, const void *source, size_t count);<br>返回值说明：返回指向dest的void *指针<br>函数说明：memcpy功能和memmove相同，但是memcpy中dest和source中的区域不能重叠，否则会出现未知结果。</p>
<p>原型：char *strstr(char *haystack, char *needle);<br>用法：#include &lt;string.h&gt;<br>功能：从字符串haystack中寻找needle第一次出现的位置（不比较结束符NULL)。<br>说明：返回指向第一次出现needle位置的指针，如果没找到则返回NULL。</p>
<p>函数原型：char * strcpy(char * strDest,const char * strSrc);<br>char * strcpy(char * strDest,const char * strSrc)<br>{<br>if ((strDest==NULL)||(strSrc==NULL)) <br>throw "Invalid argument(s)"; <br>char * strDestCopy=strDest; <br>while ((*strDest++=*strSrc++)!='\0')<br>;<br>return strDestCopy;<br>}<br><br>memcpy和memmove 的区别：<br>函数memcpy()从source指向的区域向dest指向的区域复制count个字符，如果两数组重叠，不定义该函数的行为。而memmove()如果两函数重叠，赋值仍正确进行。memcpy函数假设要复制的内存区域不存在重叠，如果你能确保你进行复制操作的的内存区域没有任何重叠，可以直接用memcpy；如果你不能保证是否有重叠，为了确保复制的正确性，你必须用memmove。memcpy的效率会比memmove高一些，如果还不明白的话可以看一些两者的实现：</p>
<p>void *memmove(void *dest, const void *source, size_t count)<br>{<br>assert((NULL != dest) &amp;&amp; (NULL != source));<br>char *tmp, *s;<br>if (dest &lt;= src) <br>{<br>&nbsp;&nbsp;&nbsp; tmp = (char *) dest;<br>&nbsp;&nbsp;&nbsp; s = (char *) src;<br>&nbsp;&nbsp;&nbsp; while (count--)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *tmp++ = *s++;<br>}<br>Else<br>{<br>&nbsp;&nbsp;&nbsp; tmp = (char *) dest + count;<br>&nbsp;&nbsp;&nbsp; s = (char *) src + count;<br>&nbsp;&nbsp;&nbsp; while (count--)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *--tmp = *--s;<br>}<br>return dest;<br>}<br><br>12.++i与i++<br>int arr[] = {6,7,8,9,10};<br>int *ptr = arr;<br>*(ptr++) +=123;<br>Print(&#8220;%d %d&#8221;, *ptr, *(++ptr));<br>一定要注意求值顺序，*(ptr++) +=123中先做加法6+123，然后ptr++，此时指针指向7；对于Print(&#8220;%d %d&#8221;, *ptr, *(++ptr))，从后往前执行，先做++ptr，指向8，然后输出8和8。<br>注：一般禁止在语句中这样使用++运算符，因为会依赖不同的编译器而有所不同。例如，TC中printf语句从右向左执行，VC6.0中同样从右向左执行，但是在遇见后增运算符a++或者a--时是在整个printf语句后才执行。<br>int i=8; <br>printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i--);<br>这个函数的输出结果在VC里是8 7 8 8，在TC里是8 7 7 8。<br>int i=3, j;<br>j = (i++)*(i++);<br>这个表达式输出j是9，i最后是5，因为两个i++是在整个运算式之后才进行的。<br>int i=3, j;<br>j = (++i)*(++i);<br>这个表达式输出j是25，i最后是5，因为++i相当于i加1后将i放入式子中，所以j=i*i，且i为5。<br>int i=3, j;<br>printf(&#8220;%d %d&#8221;, ++i, ++i);<br>这个表达式输出5, 4，为什么两个值不一样呢？因为printf是函数，将++i传给printf后，相当于打印的是形参，而两个++i传入的形参不同。<br>注：<span style="COLOR: red">特别要注意宏、运算与函数使用i++和++i的情况，容易让人困惑&#8230;&#8230;<br><br></span>13.<br>add ( int a, int b )<br>{<br>return a + b;<br>}</p>
<p>int main(int argc, char* argv[])<br>{<br>printf ( "2 + 3 = %d", add ( 2, 3) );<br>return 0;<br>}<br>在C语言中，凡不加返回值类型限定的函数，就会被编译器作为返回整型值处理；C++语言有很严格的类型安全检查，不允许上述情况（指函数不加类型声明）发生。可是编译器并不一定这么认定，譬如在Visual C++6.0中上述add函数的编译无错也无警告且运行正确。<br>#include "stdio.h"<br>int fun()<br>{<br>return 1;<br>}</p>
<p>main()<br>{<br>printf("%d",fun(2));<br>getchar();<br>}<br>在C语言中，可以给无参数的函数传送任意类型的参数，但是在C++编译器中编译同样的代码则会出错。所以，无论在C还是C++中，若函数不接受任何参数，一定要指明参数为void。<br>按照ANSI(American National Standards Institute)标准，不能对void指针进行算法操作，即下列操作都是不合法的：<br>void * pvoid;<br>pvoid++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ANSI：错误<br>pvoid += 1;&nbsp;&nbsp;&nbsp; //ANSI：错误<br>ANSI标准之所以这样认定，是因为它坚持：进行算法操作的指针必须是确定知道其指向数据类型大小的。<br>例如：<br>int *pint;<br>pint++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ANSI：正确<br>pint++的结果是使其增大sizeof(int)。<br>但是大名鼎鼎的GNU(GNU's Not Unix的缩写)则不这么认定，它指定void *的算法操作与char *一致。<br>因此下列语句在GNU编译器中皆正确：<br>pvoid++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //GNU：正确<br>pvoid += 1;&nbsp;&nbsp; //GNU：正确<br>pvoid++的执行结果是其增大了1。<br>在实际的程序设计中，为迎合ANSI标准，并提高程序的可移植性，我们可以这样编写实现同样功能的代码：<br>void * pvoid;<br>char* tmp = (char*)pvoid;<br>tmp++;&nbsp;&nbsp;&nbsp; //ANSI：正确；GNU：正确<br>tmp += 1; //ANSI：正确；GNU：正确<br>GNU和ANSI还有一些区别，总体而言，GNU较ANSI更&#8220;开放&#8221;，提供了对更多语法的支持。但是我们在真实设计时，还是应该尽可能地迎合ANSI标准。<br><br><br></p>
<img src ="http://www.cppblog.com/amazon/aggbug/96848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-09-21 14:38 <a href="http://www.cppblog.com/amazon/archive/2009/09/21/96848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LIB和DLL的区别与使用</title><link>http://www.cppblog.com/amazon/archive/2009/09/04/95318.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Fri, 04 Sep 2009 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/09/04/95318.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/95318.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/09/04/95318.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/95318.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/95318.html</trackback:ping><description><![CDATA[<p>共有两种库：<br>一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息（入口），代码由运行时加载在进程空间中的DLL提供，称为动态链接库dynamic link library。<br>一种是LIB包含函数代码本身，在编译时直接将代码加入程序当中，称为静态链接库static link library。<br>共有两种链接方式：<br>动态链接使用动态链接库，允许可执行模块（.dll文件或.exe文件）仅包含在运行时定位DLL函数的可执行代码所需的信息。<br>静态链接使用静态链接库，链接器从静态链接库LIB获取所有被引用函数，并将库同代码一起放到可执行文件中。<br><br>关于lib和dll的区别如下：<br>（1）lib是编译时用到的，dll是运行时用到的。如果要完成源代码的编译，只需要lib；如果要使动态链接的程序运行起来，只需要dll。<br>（2）如果有dll文件，那么lib一般是一些索引信息，记录了dll中函数的入口和位置，dll中是函数的具体内容；如果只有lib文件，那么这个lib文件是静态编译出来的，索引和实现都在其中。使用静态编译的lib文件，在运行程序时不需要再挂动态库，缺点是导致应用程序比较大，而且失去了动态库的灵活性，发布新版本时要发布新的应用程序才行。<br>（3）动态链接的情况下，有两个文件：一个是LIB文件，一个是DLL文件。LIB包含被DLL导出的函数名称和位置，DLL包含实际的函数和数据，应用程序使用LIB文件链接到DLL文件。在应用程序的可执行文件中，存放的不是被调用的函数代码，而是DLL中相应函数代码的地址，从而节省了内存资源。DLL和LIB文件必须随应用程序一起发行，否则应用程序会产生错误。如果不想用lib文件或者没有lib文件，可以用WIN32 API函数LoadLibrary、GetProcAddress装载。<br><br>使用lib需注意两个文件：<br>（1）.h头文件，包含lib中说明输出的类或符号原型或数据结构。应用程序调用lib时，需要将该文件包含入应用程序的源文件中。<br>（2）.LIB文件，略。<br><br>使用dll需注意三个文件：<br>（1）.h头文件，包含dll中说明输出的类或符号原型或数据结构的.h文件。应用程序调用dll时，需要将该文件包含入应用程序的源文件中。<br>（2）.LIB文件，是dll在编译、链接成功之后生成的文件，作用是当其他应用程序调用dll时，需要将该文件引入应用程序，否则产生错误。<span style="COLOR: red">如果不想用lib文件或者没有lib文件，可以用WIN32 API函数LoadLibrary、GetProcAddress装载。<br></span>（3）.dll文件，真正的可执行文件，开发成功后的应用程序在发布时，只需要有.exe文件和.dll文件，并不需要.lib文件和.h头文件。<br><br>使用lib的方法：<br>静态lib中，一个lib文件实际上是任意个obj文件的集合，obj文件是cpp文件编译生成的。在编译这种静态库工程时，根本不会遇到链接错误；即使有错，也只会在使用这个lib的EXT文件或者DLL工程里暴露出来。<br>在VC中新建一个static library类型的工程Lib，加入test.cpp文件和test.h文件（头文件内包括函数声明），然后编译，就生成了Lib.lib文件。<br>别的工程要使用这个lib有两种方式：<br>（1）在project-&gt;link-&gt;Object/Library Module中加入Lib.lib文件（先查询工程目录，再查询系统Lib目录）；或者在源代码中加入指令#pragma comment(lib, &#8220;Lib.lib&#8221;)。<br>（2）将Lib.lib拷入工程所在目录，或者执行文件生成的目录，或者系统Lib目录中。<br>（3）加入相应的头文件test.h。<br><br>使用DLL的方法：<br>使用动态链接中的lib，不是obj文件的集合，即里面不会有实际的实现，它只是提供动态链接到DLL所需要的信息，这种lib可以在编译一个DLL工程时由编译器生成。<br>创建DLL工程的方法（略）。<br>（1）隐式链接<br>第一种方法是：通过project-&gt;link-&gt;Object/Library Module中加入.lib文件（或者在源代码中加入指令#pragma comment(lib, &#8220;Lib.lib&#8221;)），并将.dll文件置入工程所在目录，然后添加对应的.h头文件。</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DLLSample.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#pragma&nbsp;comment(lib,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DLLSample.lib</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">你也可以在项目属性中设置库的链接</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_116_187_Open_Image onclick="this.style.display='none'; Codehighlighter1_116_187_Open_Text.style.display='none'; Codehighlighter1_116_187_Closed_Image.style.display='inline'; Codehighlighter1_116_187_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_116_187_Closed_Image onclick="this.style.display='none'; Codehighlighter1_116_187_Closed_Text.style.display='none'; Codehighlighter1_116_187_Open_Image.style.display='inline'; Codehighlighter1_116_187_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_116_187_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_116_187_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestDLL(</span><span style="COLOR: #000000">123</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">dll中的函数，在DllSample.h中声明</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p>（2）显式链接<br>需要函数指针和WIN32 API函数LoadLibrary、GetProcAddress装载，使用这种载入方法，<span style="COLOR: red">不需要.lib文件和.h头文件，只需要.dll文件即可</span>（将.dll文件置入工程目录中）。</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">使用函数和某些特殊变量</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">typedef&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">DLLFunc)(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_104_540_Open_Image onclick="this.style.display='none'; Codehighlighter1_104_540_Open_Text.style.display='none'; Codehighlighter1_104_540_Closed_Image.style.display='inline'; Codehighlighter1_104_540_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_104_540_Closed_Image onclick="this.style.display='none'; Codehighlighter1_104_540_Closed_Text.style.display='none'; Codehighlighter1_104_540_Open_Image.style.display='inline'; Codehighlighter1_104_540_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_104_540_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_104_540_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DLLFunc&nbsp;dllFunc;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HINSTANCE&nbsp;hInstLibrary&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;LoadLibrary(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">DLLSample.dll</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(hInstLibrary&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;NULL)<br><img id=Codehighlighter1_237_284_Open_Image onclick="this.style.display='none'; Codehighlighter1_237_284_Open_Text.style.display='none'; Codehighlighter1_237_284_Closed_Image.style.display='inline'; Codehighlighter1_237_284_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_237_284_Closed_Image onclick="this.style.display='none'; Codehighlighter1_237_284_Closed_Text.style.display='none'; Codehighlighter1_237_284_Open_Image.style.display='inline'; Codehighlighter1_237_284_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_237_284_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_237_284_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeLibrary(hInstLibrary);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dllFunc&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(DLLFunc)GetProcAddress(hInstLibrary,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">TestDLL</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(dllFunc&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;NULL)<br><img id=Codehighlighter1_391_438_Open_Image onclick="this.style.display='none'; Codehighlighter1_391_438_Open_Text.style.display='none'; Codehighlighter1_391_438_Closed_Image.style.display='inline'; Codehighlighter1_391_438_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_391_438_Closed_Image onclick="this.style.display='none'; Codehighlighter1_391_438_Closed_Text.style.display='none'; Codehighlighter1_391_438_Open_Image.style.display='inline'; Codehighlighter1_391_438_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_391_438_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_391_438_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeLibrary(hInstLibrary);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dllFunc(</span><span style="COLOR: #000000">123</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cin.</span><span style="COLOR: #0000ff">get</span><span style="COLOR: #000000">();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeLibrary(hInstLibrary);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p>LoadLibrary函数利用一个名称作为参数，获得DLL的实例（HINSTANCE类型是实例的句柄），通常调用该函数后需要查看一下函数返回是否成功，如果不成功则返回NULL（句柄无效），此时调用函数FreeLibrary释放DLL获得的内存。<br>GetProcAddress函数利用DLL的句柄和函数的名称作为参数，返回相应的函数指针，同时必须使用强转；判断函数指针是否为NULL，如果是则调用函数FreeLibrary释放DLL获得的内存。此后，可以使用函数指针来调用实际的函数。<br>最后要记得使用FreeLibrary函数释放内存。<br><br><span style="COLOR: red">注意：应用程序如何找到DLL文件？</span><br>使用LoadLibrary显式链接，那么在函数的参数中可以指定DLL文件的完整路径；如果不指定路径，或者进行隐式链接，Windows将遵循下面的搜索顺序来定位DLL：<br>（1）包含EXE文件的目录<br>（2）工程目录<br>（3）Windows系统目录<br>（4）Windows目录<br>（5）列在Path环境变量中的一系列目录<br><br></p>
<img src ="http://www.cppblog.com/amazon/aggbug/95318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-09-04 16:57 <a href="http://www.cppblog.com/amazon/archive/2009/09/04/95318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>回调函数实现方式：函数指针与函数对象</title><link>http://www.cppblog.com/amazon/archive/2009/08/28/94703.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Fri, 28 Aug 2009 13:58:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/08/28/94703.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/94703.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/08/28/94703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/94703.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/94703.html</trackback:ping><description><![CDATA[被调用函数调用的外部函数成为回调函数，windows程序中WndProc函数就是一个回调函数的典型形式。当函数不在同一文件当中（比如动态库）时，要调用其他程序中的函数就只有才用回调的方式。回调函数一般采用函数指针或者函数对象的形式实现。<br><br><strong>（1）函数指针：</strong><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;A(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p);&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;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">回调函数</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">typedef&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">CallBack)(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p);&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">声明CallBack类型的函数指针</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">CallBack&nbsp;myCallBack;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">定义函数指针变量</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">myCallBack&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;A;&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="COLOR: #008000">//</span><span style="COLOR: #008000">赋值，得到函数A的地址</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">B(A,&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">);&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">调用B函数<br></span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;B(CallBack&nbsp;lpCall,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num)<br><img id=Codehighlighter1_292_332_Open_Image onclick="this.style.display='none'; Codehighlighter1_292_332_Open_Text.style.display='none'; Codehighlighter1_292_332_Closed_Image.style.display='inline'; Codehighlighter1_292_332_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_292_332_Closed_Image onclick="this.style.display='none'; Codehighlighter1_292_332_Closed_Text.style.display='none'; Codehighlighter1_292_332_Open_Image.style.display='inline'; Codehighlighter1_292_332_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_292_332_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_292_332_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">B自己的语句</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;lpCall(&#8220;Hello&#8221;);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">B自己的语句</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"></span><span style="COLOR: #000000">}</span></span></div>
<br><strong>（2）函数对象：</strong><br>函数对象是重载了operator()操作符的类对象，与普通的函数行为类似。一般情况下用函数对象优于函数指针，主要因为：<br>第一，函数对象具有封装性，可以在不改动外部接口的情况下修改内部操作；<br>第二，函数对象可以通过数据成员存储先前调用结果，而普通函数只能通过静态变量等方式实现；<br>第三，函数对象可以实现内联调用，加快程序速度。<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CallBack<br><img id=Codehighlighter1_15_89_Open_Image onclick="this.style.display='none'; Codehighlighter1_15_89_Open_Text.style.display='none'; Codehighlighter1_15_89_Closed_Image.style.display='inline'; Codehighlighter1_15_89_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_15_89_Closed_Image onclick="this.style.display='none'; Codehighlighter1_15_89_Closed_Text.style.display='none'; Codehighlighter1_15_89_Open_Image.style.display='inline'; Codehighlighter1_15_89_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_15_89_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_15_89_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">()(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">重载()操作符</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_67_87_Open_Image onclick="this.style.display='none'; Codehighlighter1_67_87_Open_Text.style.display='none'; Codehighlighter1_67_87_Closed_Image.style.display='inline'; Codehighlighter1_67_87_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_67_87_Closed_Image onclick="this.style.display='none'; Codehighlighter1_67_87_Closed_Text.style.display='none'; Codehighlighter1_67_87_Open_Image.style.display='inline'; Codehighlighter1_67_87_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="COLOR: #000000">&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_67_87_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_67_87_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif"></span><span style="COLOR: #000000">&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}<br></span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;B(CallBack&nbsp;call,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;num)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">定义B函数</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_133_164_Open_Image onclick="this.style.display='none'; Codehighlighter1_133_164_Open_Text.style.display='none'; Codehighlighter1_133_164_Closed_Image.style.display='inline'; Codehighlighter1_133_164_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_133_164_Closed_Image onclick="this.style.display='none'; Codehighlighter1_133_164_Closed_Text.style.display='none'; Codehighlighter1_133_164_Open_Image.style.display='inline'; Codehighlighter1_133_164_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_133_164_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_133_164_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">B自己的语句</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">call(num);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">B自己的语句</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"></span><span style="COLOR: #000000">}<br></span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">B(CallBack(),&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">调用B函数</span></div>
<br>
<img src ="http://www.cppblog.com/amazon/aggbug/94703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-08-28 21:58 <a href="http://www.cppblog.com/amazon/archive/2009/08/28/94703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>引用、指针与const</title><link>http://www.cppblog.com/amazon/archive/2009/08/24/94242.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 24 Aug 2009 04:30:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/08/24/94242.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/94242.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/08/24/94242.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/94242.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/94242.html</trackback:ping><description><![CDATA[<p><strong>1.引用和指针的区别<br></strong>（1）引用必须在声明时初始化，而指针不用。用对象的地址初始化引用是错误的，应该用对象本身初始化引用，但可以定义一个指针引用（即该引用变量是指针类型，并引用一个同类型指针）。<br>int *p = a;<br>int *&amp;ref = p;&nbsp;&nbsp;&nbsp; //ok，该引用变量引用int型指针，即使p指向NULL也对<br>使用的语言如C++已经尽可能地限制引用变量的有效性，但不能完全保证。存在一些无法保证的情况，例如用于初始化引用变量的变量未被构造，主要是因为使用指针初始化引用变量导致（此时指针指向NULL，无变量）：<br>int *p = NULL;<br>int &amp;tmp = *p;&nbsp;&nbsp; //语句是有效的，但是引用变量是无效的，因为引用变量不能引用NULL<br>例如引用对象被无意析构，常表现为对函数返回的临时变量的引用（返回值在函数返回时被析构，结果引用错误）：<br>int result;<br>result = Function();&nbsp; //warning，但是result已经被赋值为a的值<br>int &amp;Function()<br>{<br>&nbsp;int a = 5;</p>
<p>&nbsp;return a;<br>}<br>一般在使用返回值引用时，常返回全局变量等无法析构的变量，例如：<br>int a = 5;&nbsp;&nbsp;&nbsp; //a是全局变量<br>int result;<br>result = Function();&nbsp; //不会出现warning<br>int &amp;Function()<br>{<br>&nbsp;return a;<br>}<br>注意int &amp;Function()的返回值可以充当左值，但是如果x是函数的临时变量，对其进行引用是危险的；所以要保证返回值不会因函数返回而被析构。如下：<br>int x = 0;&nbsp;&nbsp;&nbsp; //x是全局变量<br>int &amp;Function()<br>{<br>&nbsp;return x;<br>}<br>void main()<br>{<br>&nbsp;Function() = 100;&nbsp;&nbsp; //此时x等于100<br>}<br>（2）指针可以指向NULL，而引用不能引用NULL。<br>（3）引用一旦声明，引用的对象不能改变（不能引用其他对象了），但是引用对象的值可以改变；指针可以随时改变指向的对象，因此说指针更危险，引用比指针安全。可以说，引用是在不牺牲性能的情况下，更安全的利用指针特性所使用的技术。<br>（4）理论上存在两种必须用指针的情况，其他情况下建议用引用而不是指针：<br>A.可能存在不指向任何对象(NULL)时，使用指针。<br>B.需要指向不同对象时，使用指针。<br>（5）在函数Function(int* &amp;p)中，使用&amp;目的是为了可以改变p指针本身，使其能指向其他对象，这种用法和Function(int** p)是一样的，即指向指针的指针。<br><br><strong>2.const与指针</strong><br>（1）const int a = 10与int const a = 10等价；同理const int*与int const*是等价的。<br>（2）const int *a是指向const对象的指针，不可通过指针改变对象值，而int * const a是const指针，指针只能指向该对象。<br>（3）指针指向const对象的情况<br>const int a = 40;<br>int *p;<br>p = &amp;a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //错，编译错误，<br>p = (int*)&amp;a;&nbsp;&nbsp; //编译通过，但是p无法改变a的值<br>const int *p;<br>p = &amp;a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ok</p>
<p><strong>3.const与引用</strong><br>非Const引用只能绑定到与该引用同类型的对象；<br>Const引用则可绑定到不同但相关类型的对象或绑定到右值。<br>（1）const对象（包括常量、常量+变量生成的无名临时变量）必须用const引用来引用，而反过来const引用可以引用const和非const变量。<br>int a = 5;<br>const int b = 10;<br>int &amp;ref = a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ok <br>int &amp;ref = b;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //error<br>const int &amp;ref = b;&nbsp;&nbsp; //ok，必须为const引用<br>const int &amp;ref = a;&nbsp;&nbsp; //ok<br>const&nbsp;int&nbsp;&amp;ref = 5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ok，必须为const引用<br>const int&nbsp;&amp;ref = a + 3;&nbsp; //ok，必须为const引用<br>（2）const引用可以用不同类型的对象初始化，<br>对于不同类型间的引用：<br>double a = 3.5;<br>const int &amp;ref = a;<br>实际上其工作流程是先定义int tmp = (int)a，然后const int &amp;ref = tmp，所以必须用const引用，否则会导致错误。常量+变量生成的无名临时变量同理。<br><span style="COLOR: red">（3）const引用可以指向需要临时对象的对象或值<br>const int ival = 1024;<br>const int* &amp;b = &amp;ival;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //error<br>const int* const &amp;b = &amp;ival;&nbsp; //ok<br>解释是：<br>typedef const int * P;<br>P &amp;b = &amp;ival;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //error，因为&amp;ival的值不可改变，而b是非常量指针<br>P const &amp;b = &amp;ival;&nbsp; //等价于const P &amp;b = &amp;ival;</span></p>
<br>
<img src ="http://www.cppblog.com/amazon/aggbug/94242.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-08-24 12:30 <a href="http://www.cppblog.com/amazon/archive/2009/08/24/94242.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C/C++小结杂烩</title><link>http://www.cppblog.com/amazon/archive/2009/08/24/94223.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 24 Aug 2009 02:18:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/08/24/94223.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/94223.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/08/24/94223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/94223.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/94223.html</trackback:ping><description><![CDATA[<p>1.VC6.0下不支持long long的类型格式，只支持__int64格式；而VS2005下都支持。据说，__int64比long long处理速度要快，结果是否属实待定。<br><br>2. 只要不是在关键字中，或标识符中，或字符串常量中，随时都可以回车换行而不会提示有语法错误。还有一个换行符\，也可以实现换行。<br>如：<br>int a <br>= <br>0 <br>; <br>或：<br>int\ <br>a=\ <br>0;<br>都可以。<br><br>3.#include查找顺序：<br>如果文件名在尖括号中，则C++编译器将在存储标准头文件的主机系统的文件系统里查找；如果文件名包含在引号中，则编译器首先查找当前工作目录或源代码目录，其次在标准位置查找。<br><br>4.求单链表是否存在环路：<br>利用两个指针同时出发进行追逐，其中p1每次前进1步，p2每次前进2步，如果有环路的话两者必然会相遇。注意：p2追赶上p1时，p1一定还没走完一遍环路（p2速度是p1的两倍，极限情况是两指针同时从环起点出发），而且p2也不会跨越p1而不相遇（两者之间的差距逐渐缩小，例如5、4、3、2、1、0，差值是1）。<br><br>5.memset的用法：<br>在#include &lt;memory.h&gt; 中，函数原型：<br>Void *memset（void *buffer，int c，int count），其中buffer是分配的内存，c是初始化内容，count是初始化的字节数。<br>一般memset把buffer所指向的前count个字节设置成某个字符的ASCLL值，一般用于给数组或者字符串等类型赋值。<br>示例：<br>memset（数组名，int，sizeof（数组名）），即从起始位置到终止位置对数组进行赋值。<br><br>6.指定cout默认输出小数位数：<br>#include &lt;iomanip&gt;<br>//小数点后数位设置为n<br>Cout &lt;&lt; setiosflags(ios::fixed) &lt;&lt; setprecision(n) &lt;&lt; 变量;&nbsp;&nbsp;&nbsp; <br>//浮点数精度设置为n<br>Cout &lt;&lt; setiosflags(ios::showpoint) &lt;&lt; setprecision(n) &lt;&lt; 变量;<br><br>7.最大公约数、最小公倍数、因子分解等：<br>最大公约数：用辗转相除法，大的数 % 小的数，得出余数，然后辗转相除，直到余数为0，此时除数就是最大公约数。<br>最小公倍数：用辗转相除法求得最大公约数p，然后两数除以p得商a1、a2，可知a1和a2中必然不包含公因子（如果包含的话，p就不是最大公约数了），所以p*a1*a2就是最小公倍数。<br>因子分解：对n进行因子分解，i从2开始到数n/2，如果n能整除i，说明i是n的因子之一，并循环判断能整除多少次i，然后i继续循环递增。（另外一种简化方法是看最小因子p是多少，然后循环i从2开始到数n/p即可）<br><br>8.cin.getline和getline的区别：<br>cin.getline(char*, int)是istream类对象的成员函数，需要头文件#include &lt;iostream&gt;才能使用，主要用于c_string类型读入。<br>getline(cin, str)、getline(cin, str, char)是string类对象的成员函数，需要头文件#include &lt;string&gt;才能使用，主要用于string类型读入，后者的char是判断结束符。<br>注意：在VC6.0中，使用getline(cin, str)需要输入两次回车才能读入，这是VC6.0的BUG，在更高级别的版本中不存在该错误。<br><br>9.scanf/cin和printf/cout的比较：<br>在做ACM题目的时候，发现使用scanf比cin要快得多，同理printf比cout要快，具体原因待查。<br>注意scanf的返回值问题：<br>scanf("%d%d", &amp;a, &amp;b);<br>如果a和b都被成功读入，那么scanf的返回值就是2<br>如果只有a被成功读入，返回值为1<br>如果a和b都未被成功读入，返回值为0<br>如果遇到错误或遇到end of file，返回值为EOF。<br>所以，在使用scanf的时候，检查它的返回值来判断scanf是否正确地读到了数据。<br><br>10.100到10000的整数中因子最多的一个数？<br>方法：找到100 &lt;= 2^n &lt;= 10000最大的n即可。假设某数存在n+1个最大的因子，那么其中的n个因子之积必然大于等于2^n，于是n+1个因子之积必然大于10000，证毕。<br><br>11.一般来说，设计程序时递归与堆栈是等价的，即使用堆栈的程序一般可以写成递归形式，相反亦可。<span style="COLOR: red">不考虑程序速度的话，一般使用递归比较简单</span>。<br><br>12.char型数组<br>对于int/double型数组，例如有100个int型变量存储，那么应该定义int data[100]，其中0到99用来存储这100个变量。<br>对于char型数组，例如有100个char型变量存储，那么应该定义char data[101]，其中0到99用来存储这100个变量，100用来存储&#8217;\0&#8217;。<br><br></p>
<img src ="http://www.cppblog.com/amazon/aggbug/94223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-08-24 10:18 <a href="http://www.cppblog.com/amazon/archive/2009/08/24/94223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何将二维数组作为函数的参数传递【转载】</title><link>http://www.cppblog.com/amazon/archive/2009/08/12/92994.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Wed, 12 Aug 2009 02:25:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/08/12/92994.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/92994.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/08/12/92994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/92994.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/92994.html</trackback:ping><description><![CDATA[<p>原文地址：<a href="http://hi.baidu.com/hsyl/blog/item/7731ae519b151c898d5430f9.html">http://hi.baidu.com/hsyl/blog/item/7731ae519b151c898d5430f9.html</a><br><br>可以用二维数组名作为实参或者形参，在被调用函数中对形参数组定义时可以指定所有维数的大小，也可以省略第一维的大小说明，如：<br>void Func(int array[3][10]);<br>void Func(int array[][10]);<br>二者都是合法而且等价，但是不能把第二维或者更高维的大小省略，如下面的定义是不合法的：<br>void Func(int array[][]);<br>因为从实参传递来的是数组的起始地址，在内存中按数组排列规则存放(按行存放)，而并不区分行和列，如果在形参中不说明列数，则系统无法决定应为多少行多少列，不能只指定一维而不指定第二维，下面写法是错误的：<br>void Func(int array[3][]);<br>实参数组维数可以大于形参数组，例如实参数组定义为：<br>void Func(int array[3][10]);<br>而形参数组定义为：<br>int array[5][10];<br>这时形参数组只取实参数组的一部分，其余部分不起作用。</p>
<p>大家可以看到，将二维数组当作参数的时候，必须指明所有维数大小或者省略第一维的，但是不能省略第二维或者更高维的大小，这是由编译器原理限制的。大家在学编译原理这么课程的时候知道编译器是这样处理数组的，对于数组： <br>int p[m][n]，<br>如果要取p[i][j]的值(i&gt;=0 &amp;&amp; i&lt;m &amp;&amp; 0&lt;=j &amp;&amp; j &lt; n)，编译器是这样寻址的，它的地址为：<br>p + i*n + j;<br>从以上可以看出，如果我们省略了第二维或者更高维的大小，编译器将不知道如何正确的寻址。但是我们在编写程序的时候却需要用到各个维数都不固定的二维数组作为参数，这就难办了，编译器不能识别阿，怎么办呢？不要着急，编译器虽然不能识别，但是我们完全可以不把它当作一个二维数组，而是把它当作一个普通的指针，再另外加上两个参数指明各个维数，然后我们为二维数组手工寻址，这样就达到了将二维数组作为函数的参数传递的目的，根据这个思想，我们可以把维数固定的参数变为维数随即的参数，例如：<br>void Func(int array[3][10]); <br>void Func(int array[][10]);<br>变为：<br>void Func(int **array, int m, int n);<br>在转变后的函数中，array[i][j]这样的式子是不对的(不信，大家可以试一下)，因为编译器不能正确的为它寻址，所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为<br>*((int*)array + n*i + j);<br>在调用这样的函数的时候，需要注意一下，如下面的例子：<br>int a[3][3] = <br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {1, 1, 1},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {2, 2, 2},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {3, 3, 3}<br>};<br>Func(a, 3, 3);<br>根据不同编译器不同的设置，可能出现warning 或者error,可以进行强制转换如下调用： <br>Func((int**)a, 3, 3);<br><br><strong>补充：<br></strong>对于最后利用指针代替二维数组的做法稍显累赘，只需要一层的指针即可：<br>int a[3][3] = <br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {1, 1, 1},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {2, 2, 2},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {3, 3, 3}<br>};<br>函数使用如下：<br>Func((int*)a, 3, 3);<br>函数声明如下：<br>void Func(int *array, int m, int n);<br>函数中使用指针如下：<br>*(array + n*i + j);<br></p>
<img src ="http://www.cppblog.com/amazon/aggbug/92994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-08-12 10:25 <a href="http://www.cppblog.com/amazon/archive/2009/08/12/92994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>联合union的某些特征</title><link>http://www.cppblog.com/amazon/archive/2009/08/11/92955.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Tue, 11 Aug 2009 14:00:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/08/11/92955.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/92955.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/08/11/92955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/92955.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/92955.html</trackback:ping><description><![CDATA[<p>联合union的特征包括：<br>（1）不能直接对联合内的元素进行初始化；<br>（2）某个时候只能使用其中一个元素；<br>（3）分配给union的size是其中最大元素的size。<br><br>PS：<span style="COLOR: red">对union中的某元素赋值，那么union中其他元素的值又是多少呢？</span><br>union test<br>{<br>&nbsp;int a;<br>&nbsp;char b;<br>}hh;</p>
<p>hh.a = 0;<br>hh.b = -1;<br>cout &lt;&lt; hh.a &lt;&lt; endl;<br>最后的结果是hh.a = 255。原因是hh.b = -1时，低位字节存储11111111（补码），那么整个4个字节就是00000000 00000000 00000000 11111111，即255。（正数的原码、反码、补码都一样，负数的原码不变，反码在原码基础上取反，补码在原码基础上取反加1）</p>
<img src ="http://www.cppblog.com/amazon/aggbug/92955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-08-11 22:00 <a href="http://www.cppblog.com/amazon/archive/2009/08/11/92955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sort和qsort的比较分析</title><link>http://www.cppblog.com/amazon/archive/2009/08/11/92953.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Tue, 11 Aug 2009 13:56:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/08/11/92953.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/92953.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/08/11/92953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/92953.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/92953.html</trackback:ping><description><![CDATA[<p>qsort()定义在头文件&lt;stdlib.h&gt;中：<br>_CRTIMP void __cdecl qsort (void*, size_t, size_t, int (*)(const void*, const void*))<br>qsort（数组名，元素个数，每个元素占用的空间（sizeof），比较函数），其中比较函数是自己写的函数，遵循int com（const void *a，const void *b）的格式。当a、b关系为 &gt;&nbsp; &lt;&nbsp; = 时，分别返回正值 负值 零（或者相反）。使用const void*而不是char*的原因是为了可以对非字符串类型的数值进行排序。具体实例如下：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;nn[</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">],n</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;com(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">a,</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">b)<br><img id=Codehighlighter1_56_88_Open_Image onclick="this.style.display='none'; Codehighlighter1_56_88_Open_Text.style.display='none'; Codehighlighter1_56_88_Closed_Image.style.display='inline'; Codehighlighter1_56_88_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_56_88_Closed_Image onclick="this.style.display='none'; Codehighlighter1_56_88_Closed_Text.style.display='none'; Codehighlighter1_56_88_Open_Image.style.display='inline'; Codehighlighter1_56_88_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_56_88_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_56_88_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)a</span><span style="COLOR: #000000">-*</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)b;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">qsort((</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)nn,n,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">),com);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<p>注意：缺省是升序排序，可以通过函数com改变排序顺序。<br><br>sort()定义在在头文件&lt;algorithm&gt;中。<br>template&lt;typename _RandomAccessIterator&gt;<br>void __insertion_sort(_RandomAccessIterator __first, _RandomAccessIterator __last)<br>sort函数是标准模板库的函数，已知开始和结束的地址即可进行排序，可以用于比较任何容器（必须满足随机迭代器），任何元素，任何条件，执行速度一般比qsort要快。具体事例如下：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;ch[</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sdasdacsdasdas</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">ch</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">sort(ch,ch</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">14</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">cout</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">ch</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;</span></div>
<p>注意：缺省是升序排序。sort中一个改变排序顺序的例子如下：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">algorithm</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;cmp&nbsp;(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a,&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b)<br><img id=Codehighlighter1_100_117_Open_Image onclick="this.style.display='none'; Codehighlighter1_100_117_Open_Text.style.display='none'; Codehighlighter1_100_117_Closed_Image.style.display='inline'; Codehighlighter1_100_117_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_100_117_Closed_Image onclick="this.style.display='none'; Codehighlighter1_100_117_Closed_Text.style.display='none'; Codehighlighter1_100_117_Open_Image.style.display='inline'; Codehighlighter1_100_117_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_100_117_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_100_117_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;b;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_131_235_Open_Image onclick="this.style.display='none'; Codehighlighter1_131_235_Open_Text.style.display='none'; Codehighlighter1_131_235_Closed_Image.style.display='inline'; Codehighlighter1_131_235_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_131_235_Closed_Image onclick="this.style.display='none'; Codehighlighter1_131_235_Closed_Text.style.display='none'; Codehighlighter1_131_235_Open_Image.style.display='inline'; Codehighlighter1_131_235_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_131_235_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_131_235_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;data[</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">&nbsp;data[i];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;sort(data,&nbsp;data&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,&nbsp;cmp);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<img src ="http://www.cppblog.com/amazon/aggbug/92953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-08-11 21:56 <a href="http://www.cppblog.com/amazon/archive/2009/08/11/92953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>匈牙利标记法【转载】</title><link>http://www.cppblog.com/amazon/archive/2008/12/29/70674.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 29 Dec 2008 07:34:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2008/12/29/70674.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/70674.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2008/12/29/70674.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/70674.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/70674.html</trackback:ping><description><![CDATA[<p>匈牙利表示法：它通过在每一个表示符名字的前面放置一个数据类型助记符，为程序员提供了对标识符的即时识别。<br><br>《1》MFC、句柄、控件及结构的命名规则。<br>&nbsp;&nbsp;&nbsp;&nbsp; Windows类型&nbsp; 样本变量&nbsp;&nbsp;&nbsp; MFC类&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 样本对象<br>&nbsp;&nbsp;&nbsp;&nbsp; HWND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hWnd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CWnd*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pWnd<br>&nbsp;&nbsp;&nbsp;&nbsp; HDLG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hDlg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CDialog*&nbsp;&nbsp;&nbsp;&nbsp; pDlg<br>&nbsp;&nbsp;&nbsp;&nbsp; HDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hDC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CDC*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDC<br>&nbsp;&nbsp;&nbsp;&nbsp; HGDIOBJ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hGdiObj&nbsp;&nbsp;&nbsp;&nbsp; CGdiObject*&nbsp; pGdiObj<br>&nbsp;&nbsp;&nbsp;&nbsp; HPEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hPen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPen*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pPen<br>&nbsp;&nbsp;&nbsp;&nbsp; HBRUSH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hBrush&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CBrush*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pBrush<br>&nbsp;&nbsp;&nbsp;&nbsp; HFONT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hFont&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CFont*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pFont<br>&nbsp;&nbsp;&nbsp;&nbsp; HBITMAP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hBitmap&nbsp;&nbsp;&nbsp;&nbsp; CBitmap*&nbsp;&nbsp;&nbsp;&nbsp; pBitmap<br>&nbsp;&nbsp;&nbsp;&nbsp; HPALETTE&nbsp;&nbsp;&nbsp;&nbsp; hpalette&nbsp;&nbsp;&nbsp; CPalette*&nbsp;&nbsp;&nbsp; pPalette<br>&nbsp;&nbsp;&nbsp;&nbsp; HRGN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hRgn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRgn*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pRgn<br>&nbsp;&nbsp;&nbsp;&nbsp; HMENU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hMenu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMenu*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pMenu<br>&nbsp;&nbsp;&nbsp;&nbsp; HWND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hCtl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CState*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pState<br>&nbsp;&nbsp;&nbsp;&nbsp; HWND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hCtl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CButton*&nbsp;&nbsp;&nbsp;&nbsp; pButton<br>&nbsp;&nbsp;&nbsp;&nbsp; HWND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hCtl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CEdit*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pEdit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; HWND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hCtl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CListBox*&nbsp;&nbsp;&nbsp; pListBox<br>&nbsp;&nbsp;&nbsp;&nbsp; HWND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hCtl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CComboBox*&nbsp;&nbsp; pComboBox<br>&nbsp;&nbsp;&nbsp;&nbsp; HWND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hCtl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CScrollBar*&nbsp; pScrollBar<br>&nbsp;&nbsp;&nbsp;&nbsp; HSZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hszStr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pStr<br>&nbsp;&nbsp;&nbsp;&nbsp; POINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CPoint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pt<br>&nbsp;&nbsp;&nbsp;&nbsp; SIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size<br>&nbsp;&nbsp;&nbsp;&nbsp; RECT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rect<br>&nbsp;&nbsp;&nbsp; <br>《2》一般前缀命名规范<br>&nbsp;&nbsp;&nbsp;&nbsp; 前缀&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实例<br>&nbsp;&nbsp;&nbsp;&nbsp; C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类或结构&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CDocument,CPrintInfo<br>&nbsp;&nbsp;&nbsp;&nbsp; m_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 成员变量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_pDoc, m_nCustomers<br><br>《3》变量名规范<br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实例<br>&nbsp;&nbsp;&nbsp;&nbsp; ch&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp;&nbsp;&nbsp; 8为字符&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chGrade<br>&nbsp;&nbsp;&nbsp;&nbsp; ch&nbsp;&nbsp;&nbsp; TCHAR&nbsp;&nbsp;&nbsp; 如果_UNICODE定义，为16位字符&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chName<br>&nbsp;&nbsp;&nbsp;&nbsp; b&nbsp;&nbsp;&nbsp;&nbsp; BOOL&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bEnabled<br>&nbsp;&nbsp;&nbsp;&nbsp; n&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 整型（其大小依赖于操作系统）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nLength<br>&nbsp;&nbsp;&nbsp;&nbsp; n&nbsp;&nbsp;&nbsp;&nbsp; UNIT&nbsp;&nbsp;&nbsp;&nbsp; 无符号值（其大小依赖于操作系统）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nLength<br>&nbsp;&nbsp;&nbsp;&nbsp; w&nbsp;&nbsp;&nbsp;&nbsp; WORD&nbsp;&nbsp;&nbsp;&nbsp; 16位无符号值&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; wPos<br>&nbsp;&nbsp;&nbsp;&nbsp; l&nbsp;&nbsp;&nbsp;&nbsp; LONG&nbsp;&nbsp;&nbsp;&nbsp; 32位有符号整型&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; lOffset<br>&nbsp;&nbsp;&nbsp;&nbsp; dw&nbsp;&nbsp;&nbsp; DWORD&nbsp;&nbsp;&nbsp; 32位无符号整型&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; dwRange<br>&nbsp;&nbsp;&nbsp;&nbsp; p&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDoc<br>&nbsp;&nbsp;&nbsp;&nbsp; lp&nbsp;&nbsp;&nbsp; FAR*&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpDoc<br>&nbsp;&nbsp;&nbsp;&nbsp; lpsz&nbsp; LPSTR&nbsp;&nbsp;&nbsp;&nbsp; 32位字符串指针&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpszName<br>&nbsp;&nbsp;&nbsp;&nbsp; lpsz&nbsp; LPCTSTR&nbsp;&nbsp; 如果_UNICODE定义，位32位常量字符串指针 lpszName<br>&nbsp;&nbsp;&nbsp;&nbsp; h&nbsp;&nbsp;&nbsp;&nbsp; handle&nbsp;&nbsp;&nbsp; Windows对象句柄&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hWnd<br>&nbsp;&nbsp;&nbsp;&nbsp; lpfn&nbsp; callback&nbsp; 指向CALLBACK函数的远指针&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpfnAbort<br><br>《4》应用程序符号命名规范<br>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实例&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 范围<br>&nbsp;&nbsp;&nbsp;&nbsp; IDR_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不同类型的多个资源共享标识&nbsp;&nbsp;&nbsp;&nbsp; IDR_MAINFRAME&nbsp;&nbsp;&nbsp;&nbsp; 1-0x6FFF<br>&nbsp;&nbsp;&nbsp;&nbsp; IDD_&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; IDD_SPELL_CHECK&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp;&nbsp; HIDD_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对话框资源的Help上下文&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIDD_SPELL_CHECK&nbsp; 0X20001-0X26FF<br>&nbsp;&nbsp;&nbsp;&nbsp; IDB_&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;&nbsp; IDB_COMPANY_LOGO&nbsp; 1-0X6FFF<br>&nbsp;&nbsp;&nbsp;&nbsp; IDC_&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;&nbsp; IDC_PENCIL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp;&nbsp; IDI_&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;&nbsp; IDI_NOTEPAD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp;&nbsp; ID_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 来自菜单项或工具栏的命令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ID_TOOLS_SPELLING 0x8000-0xDFFF <br>&nbsp;&nbsp;&nbsp;&nbsp; HID_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命令Help上下文&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HID_TOOLS_SPELLING ...<br>&nbsp;&nbsp;&nbsp;&nbsp; IDP_&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; IDP_INVALID_PARINO 8-0xDFFF<br>&nbsp;&nbsp;&nbsp;&nbsp; HIDP_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 消息框Help上下文&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HIDP_INVALID_PARINO 0X30008-0x3DFFF<br>&nbsp;&nbsp;&nbsp;&nbsp; IDS_&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;&nbsp;&nbsp;&nbsp; IDS_COPYRIGHT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1-0x7FFF<br>&nbsp;&nbsp;&nbsp;&nbsp; IDC_&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对话框内的控件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IDC_RECALC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8-0xDFFF<br><br>《5》Microsoft MFC宏命名规范<br>&nbsp;&nbsp;&nbsp;&nbsp; 名称&nbsp;&nbsp;&nbsp;&nbsp; 类型<br>&nbsp;&nbsp;&nbsp;&nbsp; _AFXDLL&nbsp; 唯一的动态连接库（Dynamic Link Library）版本<br>&nbsp;&nbsp;&nbsp;&nbsp; _ALPHA&nbsp;&nbsp; 仅编译DEC Alpha处理器<br>&nbsp;&nbsp;&nbsp;&nbsp; _DEBUG&nbsp;&nbsp; 包括诊断的调式版本<br>&nbsp;&nbsp;&nbsp;&nbsp; _MBCS&nbsp;&nbsp;&nbsp; 编译多字节字符集<br>&nbsp;&nbsp;&nbsp;&nbsp; _UNICODE 在一个应用程序中打开Unicode<br>&nbsp;&nbsp;&nbsp;&nbsp; AFXAPI&nbsp;&nbsp; MFC提供的函数<br>&nbsp;&nbsp;&nbsp;&nbsp; CALLBACK 通过指针回调的函数<br><br>《6》库标识命名规范<br>&nbsp;&nbsp;&nbsp;&nbsp; 指示符&nbsp;&nbsp; 值和含义<br>&nbsp;&nbsp;&nbsp;&nbsp; u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ANSI（N）或Unicodeu（U）<br>&nbsp;&nbsp;&nbsp;&nbsp; d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调试或发行：D=调式；忽略指示符为发行<br><br>《7》静态库版本命名规范<br>&nbsp;&nbsp;&nbsp;&nbsp; 库&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 描述<br>&nbsp;&nbsp;&nbsp;&nbsp; NAFXCWD.LIB&nbsp;&nbsp;&nbsp; 调试版本：MFC静态连接库<br>&nbsp;&nbsp;&nbsp;&nbsp; NAFXCW.LIB&nbsp;&nbsp;&nbsp;&nbsp; 发行...<br>&nbsp;&nbsp;&nbsp;&nbsp; UAFXCWD.LIB&nbsp;&nbsp;&nbsp; 调试版本：具有Unicode支持的MFC静态连接库<br>&nbsp;&nbsp;&nbsp;&nbsp; UAFXCW.LIB&nbsp;&nbsp;&nbsp;&nbsp; 发行...<br>&nbsp;&nbsp;&nbsp; <br>《8》动态库连接命名规范<br>&nbsp;&nbsp;&nbsp;&nbsp; 名称&nbsp;&nbsp;&nbsp;&nbsp; 类型<br>&nbsp;&nbsp;&nbsp;&nbsp; _AFXDLL&nbsp; 唯一的动态连接库（DLL）版本<br>&nbsp;&nbsp;&nbsp;&nbsp; WINAPI&nbsp;&nbsp; Windows所提供的函数<br>&nbsp;&nbsp;&nbsp; <br>《9》Windows.h命名规范<br>&nbsp;&nbsp;&nbsp;&nbsp; 类型定义&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 描述<br>&nbsp;&nbsp;&nbsp;&nbsp; WINAPI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用在API 声明的FAR PASCAL位置，如果正在编写一个具有导出API入口点的DLL，则可以在<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 自己的API中使用该类型<br>&nbsp;&nbsp;&nbsp;&nbsp; CALLBACK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用在应用程序回叫例程如窗口和对话框中的FAR PASCAL位置<br>&nbsp;&nbsp;&nbsp;&nbsp; LPCSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与LPSTR相同，只是LPCSTR用于只读串指针，其定义类似于（const char FAR*）<br>&nbsp;&nbsp;&nbsp;&nbsp; UNIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与可移值的无符号整型类型，其大小由主机环境决定（对Windows NT和Windows 95为32位）。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它是unsigned int的同义词，使用WORD位置，在一个32位的平台上希望得到一个16为无符号值<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的极少数情况除外<br>&nbsp;&nbsp;&nbsp;&nbsp; LRESULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 窗口程序返回值的类型<br>&nbsp;&nbsp;&nbsp;&nbsp; LPARAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 声明lParam所使用的类型，lParam 是窗口程序的第四个参数<br>&nbsp;&nbsp;&nbsp;&nbsp; WPARAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 声明wParam所使用的类型， wParam是窗口程序的第三个参数（一种组合数据类型）<br>&nbsp;&nbsp;&nbsp;&nbsp; LPVOID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般的指针类型，与（void*）等同。应该使用它来代替LPSTR。<br><br><br></p>
  <img src ="http://www.cppblog.com/amazon/aggbug/70674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2008-12-29 15:34 <a href="http://www.cppblog.com/amazon/archive/2008/12/29/70674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++进阶必读书籍【转载】</title><link>http://www.cppblog.com/amazon/archive/2008/12/29/70665.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 29 Dec 2008 06:17:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2008/12/29/70665.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/70665.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2008/12/29/70665.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/70665.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/70665.html</trackback:ping><description><![CDATA[<p><strong>（一）语言入门:<br></strong><br>《C++ Primer》<br>最新版本：第三版（第四版国外已上架，国内一些网上书店也在预订中）<br>适合有丰富C经验，缺乏C++经验的。不过我个人一直认为此书带着过于强烈的C语言的痕迹，对于C++的学习未必是好事。</p>
<p>《The C++ Programming Language》/《C++程序设计语言》<br>最新版本：第三版特别版<br>简称TC++PL，有其他语言的丰富经验的。（也有人简称之为&#8220;TCPL&#8221;，但需与另一本《The C Programmer Language》区分开来）</p>
<p>《Essential C++》<br>《Accelerated C++》<br>这两本薄一些，都是不错的选择。《Accelerated C++》本人没有读过，从各方面的评价来看，完全值得推荐。</p>
<p>以上几本书都有相应的中文版，而且翻译的质量都不错。上面的书未必都需要读一遍，但无论如何，TC++PL是应该阅读的。<br><br><strong>（二）进阶A：</strong><br>这个路线侧重于语言本身</p>
<p>《Effective C++》<br>最新版本：第二版（第三版国外已上架，国内一些网上书店也在预订中）<br>简称EC。C++程序员必读！很多时候，我们说C++圣经不是指TC++PL，而是这一本。《The Pragmatic Programmer》一书中写到：&#8220;一旦你发现自己要参与C++项目的开发，赶快跑（不要走）到书店去购买Scott Mayer的《Effective C++》，可能还要《More Effective C++》&#8221;。</p>
<p>《C++ Coding Standards: 101 Rules, Guidelines, and Best Practices》/《C++ 编程规范》<br>个人认为此书应为C++程序员必备的案头书。几乎Effective系列和Exceptional系列都在这里得到了总结。最新的模版、异常的业界经验都在这里的到了体现。可能的唯一缺陷就是对一个新手而言，关于&#8220;为什么这么做&#8221;的问题，解释的不够。<br>我的看法是：如果你不理解其中的条款，记忆，并且照做；如果你理解其中的条款，我猜你一定会同意书中的观点。我认为这本书中的内容至少在2009年以前都不会过时，人们将广为传诵它制定的101条戒律。<br>还不知道他的简称，也许&#8220;101&#8221;会成为一个候选者？ </p>
<p>提到《Effective C++》，那么另外三本书一一浮出水面：<br>《More Effective C++》<br>《Exceptional C++》<br>《More Exceptional C++》。<br>新书《Exceptional C++ Style》也是值得一看的好书。<br>上述几本书，一本也不应该放过。<br>个人建议上述书籍按顺序阅读。并且，在将来反复阅读这几本书。<br><br><strong>（三）进阶B：</strong><br>这个路线侧重于程序库。 </p>
<p>《The C++ Standard Library》/《C++标准程序库—自修教程与参考手册》<br>听说过STL吗？这本书会教你最基本的，也是最重要的STL的使用。这本书，应该是必读的。</p>
<p>《Effective STL》<br>会使用STL还不够，还必须知道什么时候选择什么STL组件，这是STL使用的必读书。</p>
<p>《Generic Programming and the STL: Using and Extending the C++ Standard Template Library》/《泛型编程与STL》。<br>这本书理论性较强，但是真的很严谨，而且并不是非常难懂。理解其中对于Concept的解释，将是非常重要的。 </p>
<p>《C++ STL》<br>这不是讲述使用程序库的，而是讲述程序库实现原理的。肠胃不好的，需要慢慢吸收。</p>
<p>这个路线的书，仍然是建议按顺序阅读。<br>进阶A、进阶B两个路线应该是可以并行的。<br><br><strong>其他进阶参考书</strong><br>提出这些参考书，只是避免争议，也为开阔视野，笔者并不曾完全读过所有的。</p>
<p>《Thinking in C++》/《C++编程思想》<br>这本书及其中文版传言好坏都有，没有认真看过，不做评价，如果确有兴趣，不妨尝试一下该书。</p>
<p>以下几本书基本上涉及的都是语言本身，大体上可以按照以下的顺序阅读。</p>
<p>《C++必知必会》<br>如果早一年，这本书将是重量级的，然而它被101和《Exceptional C++ Style》盖过一头。</p>
<p>《C++ Gotchas: Avoiding Common Problems in Coding and Design》/《C++程序设计陷阱》<br>这又是一本我未曾读过，而且广受好评的书。</p>
<p>《STL 源码剖析》<br>这本书我刚到手，就被人"借"走，以至于到现在也没有看过。看过这本书的朋友，可以给一个合适的评价。 </p>
<p>高级：<br>《The Design and Evolution of C++》/《C++语方的设计和演化》<br>简称D&amp;E，内容并不艰深，Bjarne的书，仅此，就值得一读。<br>前段时间，互动网曾8块一本（人民币）贱卖此书，现在好像没了。</p>
<p>《Inside The C++ Object Model》/《深度探索C++对象模型》<br>C程序员读后一定会觉得C++原来并不神秘。</p>
<p>《C++ Template》<br>在阅读STL、Boost或者Loki的源代码之前，请仔细阅读本书，它可以减轻一些阅读的烦恼。这本书是讨论C++模版的权威。 </p>
<p>《Modern C++ Design Generic Programming and Design Patterns Applied》/《C++设计新思维——泛型编程与设计模式之应用》<br>简称MCD。在阅读MCD之前，建议先阅读一下《C++ Template》。</p>
<p>《对象揭秘：Java、Eiffel和C++》<br>你对C++不满吗？这本书可以部分地帮你完成抱怨的目标。也许它还可以让你不迷信C++。</p>
<p>最后，一份C++标准文档也是应该加以咀嚼的。 <br>还有一些书籍，并不能简单的归于C++，也难以在纯粹的书本学习中加以掌握。《Design Patterns》/《设计模式》一书就归于此类。</p>
<p>所有上述的书籍，要么谈论C++语言本身，要么谈论STL的，要么兼而有之（当然严格讲STL也是C++语言非常重要的一部分）。偶尔，某些书中条目也会涉及实际工程。这些书并不是C++软件开发的全部，但是他们很重要。阅读这些书，未必需要化费太多的精力，有时候是会困难，但也有时候会很快速。<br>最后，编程语言并非计算机科学技术的全部，尤其对于在校的学生来说，打好基础、开阔视野都是非常重要的。 <br><br><br></p>
  <img src ="http://www.cppblog.com/amazon/aggbug/70665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2008-12-29 14:17 <a href="http://www.cppblog.com/amazon/archive/2008/12/29/70665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于WIN32 API及MFC的多线程技术</title><link>http://www.cppblog.com/amazon/archive/2008/11/27/67989.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Thu, 27 Nov 2008 08:30:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2008/11/27/67989.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/67989.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2008/11/27/67989.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/67989.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/67989.html</trackback:ping><description><![CDATA[32位Windows环境下的Win32 API提供了多线程应用程序开发所需要的接口函数，而相应的MFC类库封装了多线程编程的类，用户在开发时可根据应用程序的需要和特点选择相应的工具。以下将概括归纳基于WIN32 API和MFC的多线程技术，以及线程通信的实现方法。<br><br><strong>WIN32 API下多线程编程</strong><br><br>1.线程创建：该函数在其调用进程的进程空间里创建一个新的线程，并返回已建线程的句柄。<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">HANDLE&nbsp;CreateThread(<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPSECURITY_ATTRIBUTES&nbsp;lpThreadAttributes,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwStackSize,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPTHREAD_START_ROUTINE&nbsp;lpStartAddress,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPVOID&nbsp;lpParameter,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwCreationFlags,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPDWORD&nbsp;lpThreadId<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);</span></div>
<p>其中各参数说明如下：<br><span style="FONT-FAMILY: wingdings">l</span>lpThreadAttributes：指向一个 SECURITY_ATTRIBUTES 结构的指针，该结构决定了线程的安全属性，一般置为 NULL； <br><span style="FONT-FAMILY: wingdings">l</span>dwStackSize：指定了线程的堆栈深度，一般都设置为0，表示线程堆栈大小与创建它的线程相同； <br><span style="FONT-FAMILY: wingdings">l</span>lpStartAddress：表示新线程开始执行时代码所在函数的地址，即线程的起始地址。一般情况为(LPTHREAD_START_ROUTINE)ThreadFunc，ThreadFunc 是线程函数名，函数原型如下：<br>&nbsp;DWORD&nbsp; WINAPI&nbsp; threadfunc(LPVOID&nbsp; param);<br><span style="FONT-FAMILY: wingdings">l</span>lpParameter：指定了线程执行时传送给线程的32位参数，即线程函数的参数； <br><span style="FONT-FAMILY: wingdings">l</span>dwCreationFlags：控制线程创建的附加标志，可以取两种值。如果该参数为0，线程在被创建后就会立即开始执行；如果该参数为CREATE_SUSPENDED,则系统产生线程后，该线程处于挂起状态，并不马上执行，直至函数ResumeThread被调用； <br><span style="FONT-FAMILY: wingdings">l</span>lpThreadId：该参数返回所创建线程的ID；</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">DWORD&nbsp;WINAPI&nbsp;Func1(LPVOID&nbsp;param)<br><img id=Codehighlighter1_33_113_Open_Image onclick="this.style.display='none'; Codehighlighter1_33_113_Open_Text.style.display='none'; Codehighlighter1_33_113_Closed_Image.style.display='inline'; Codehighlighter1_33_113_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_33_113_Closed_Image onclick="this.style.display='none'; Codehighlighter1_33_113_Closed_Text.style.display='none'; Codehighlighter1_33_113_Open_Image.style.display='inline'; Codehighlighter1_33_113_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_33_113_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_33_113_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"title</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;MB_OK);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_127_291_Open_Image onclick="this.style.display='none'; Codehighlighter1_127_291_Open_Text.style.display='none'; Codehighlighter1_127_291_Closed_Image.style.display='inline'; Codehighlighter1_127_291_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_127_291_Closed_Image onclick="this.style.display='none'; Codehighlighter1_127_291_Closed_Text.style.display='none'; Codehighlighter1_127_291_Open_Image.style.display='inline'; Codehighlighter1_127_291_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_127_291_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_127_291_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;p;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;CreateThread(NULL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;(LPTHREAD_START_ROUTINE)Func1,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">id);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">WaitForSingleObject(p,&nbsp;INFINITE);</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<p><br>2.线程悬挂和恢复：创建新的线程后，该线程就开始启动执行。但如果在dwCreationFlags中使用了CREATE_SUSPENDED特性，线程并不马上执行，而是先挂起，等到调用ResumeThread后才开始启动线程。</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">DWORD&nbsp;SuspendThread(HANDLE&nbsp;hThread);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">该函数用于挂起指定的线程，如果函数执行成功，则线程的执行被终止。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">DWORD&nbsp;ResumeThread(HANDLE&nbsp;hThread);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">该函数用于结束线程的挂起状态，执行线程。</span></div>
<p><br>3.线程优先级操作：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;GetThreadPriority(HANDLE&nbsp;hThread);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">调用该函数得到线程优先权。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">BOOL&nbsp;SetThreadPriority(HANDLE&nbsp;hThread,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;nPriority);&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">调用该函数来设置线程的优先权。</span></div>
<p><br>4.线程退出：当调用线程的函数返回后，线程自动终止。</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果需要在线程的执行过程中终止则可调用函数：&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">VOID&nbsp;ExitThread(DWORD&nbsp;dwExitCode);&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果在线程的外面终止线程，则可调用下面的函数：&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">BOOL&nbsp;TerminateThread(HANDLE&nbsp;hThread,DWORD&nbsp;dwExitCode);&nbsp;</span></div>
<p>注意：<br><span style="COLOR: red">(1)TerminateThread函数可能会引起系统不稳定，而且线程所占用的资源也不释放。因此，一般情况下，建议不要使用该函数。 <br>(2)如果要终止的线程是进程内的最后一个线程，则线程被终止后相应的进程也应终止。 <br>(3)释放资源后，将线程HANDLE置成NULL。<br>(4)使用TerminateThread后，需调用CloseHandle( )函数释放线程所占用的堆栈。</span><br><br><br><strong>MFC下多线程编程之工作线程编程</strong><br><br>1.线程创建：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">CWinThread</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">AfxBeginThread(&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AFX_THREADPROC&nbsp;pfnThreadProc,&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPVOID&nbsp;pParam,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&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: #0000ff">int</span><span style="COLOR: #000000">&nbsp;nPriority&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;THREAD_PRIORITY_NORMAL,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;nStackSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwCreateFlags&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LPSECURITY_ATTRIBUTES&nbsp;lpSecurityAttrs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL);</span></div>
<p>各参数如下：<br><span style="FONT-FAMILY: wingdings">l</span>参数pfnThreadProc是线程执行体函数，函数原形为: UINT ThreadFunction( LPVOID pParam)。 <br><span style="FONT-FAMILY: wingdings">l</span>参数pParam是传递给执行函数的参数； <br><span style="FONT-FAMILY: wingdings">l</span>参数nPriority是线程执行权限，可选值： <br>THREAD_PRIORITY_NORMAL、THREAD_PRIORITY_LOWEST、THREAD_PRIORITY_HIGHEST、THREAD_PRIORITY_IDLE。 <br><span style="FONT-FAMILY: wingdings">l</span>参数dwCreateFlags是线程创建时的标志，可取值CREATE_SUSPENDED，表示线程创建后处于挂起状态，调用ResumeThread函数后线程继续运行，或者取值&#8220;0&#8221;表示线程创建后处于运行状态。 <br><span style="FONT-FAMILY: wingdings">l</span>返回值是CWinThread类对象指针，它的成员变量m_hThread为线程句柄，在Win32 API方式下对线程操作的函数参数都要求提供线程的句柄，所以当线程创建后可以使用所有Win32 API函数对pWinThread-&gt;m_Thread线程进行相关操作。 <br><br><span style="COLOR: red">注意：如果在一个类对象中创建和启动线程时，应将线程函数定义成类外的全局函数（或者类中的静态函数似乎也可以）。</span><br><br>2.线程悬挂和恢复 / 优先级操作：同上。<br><br>3.线程退出：当调用线程的函数返回后，线程自动终止。</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">线程可以在自身内部调用来终止自身的运行。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;AfxEndThread(UINT&nbsp;nExitCode,&nbsp;BOOL&nbsp;bDelete&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;TRUE);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">可以在线程的外部调用来强行终止一个线程的运行。</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">BOOL&nbsp;TerminateThread(&nbsp;HANDLE&nbsp;hThread,&nbsp;DWORD&nbsp;dwExitCode&nbsp;);</span></div>
<dl>
<dt>
<p>注意：<br><span style="COLOR: red">(1)使用TerminateThread后，需调用CloseHandle( )函数释放线程所占用的堆栈。<br>(2)释放资源后，将线程HANDLE置成NULL。<br></span><br><br><strong>进程间通信</strong><br><br>1.全局变量方式：<br>(1)进程和线程共享全局变量，可利用该全局变量达到通信的目的。<br>(2)将进程的HADNLE作为参数传递给线程函数，然后线程可根据此HANDLE对进程的变量进行操作。<br><br>2.消息通信方式：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">BOOL&nbsp;PostMessage(HWND&nbsp;hWnd,&nbsp;UINT&nbsp;Msg,&nbsp;WPARAM&nbsp;wParam,&nbsp;LPARAM&nbsp;lParam);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">BOOL&nbsp;PostThreadMessage(HWND&nbsp;hWnd,&nbsp;UINT&nbsp;Msg,&nbsp;WPARAM&nbsp;wParam,&nbsp;LPARAM&nbsp;lParam);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
显然它们发送到的对象不同：PostMessage发消息给窗口，PostThreadMessage发消息给线程。且当PostThreadMessage的hWnd = NULL时，表明该消息传递给当前线程本身。&nbsp;<br>BOOL&nbsp;&nbsp; PostMessage(&nbsp;&nbsp; UINT&nbsp;&nbsp; message,&nbsp;&nbsp; WPARAM&nbsp;&nbsp; wParam&nbsp;&nbsp; =&nbsp;&nbsp; 0,&nbsp;&nbsp; LPARAM&nbsp;&nbsp; lParam&nbsp;&nbsp; =0&nbsp;&nbsp; );&nbsp;&nbsp; <br>返回值如果公布了消息，则返回非零值；否则返回0。&nbsp;&nbsp;&nbsp;<br>参数message指定了要公布的消息。&nbsp;&nbsp; <br>wParam指定了附加的消息信息。这个参数的内容依赖于要公布的消息。&nbsp;&nbsp; <br>lParam指定了附加的消息信息。这个参数的内容依赖于要公布的消息。&nbsp;&nbsp; <br>说明：这个函数将一个消息放入窗口的消息队列，然后直接返回，并不等待对应的窗口处理消息。消息队列中的消息是通过调用Windows的GetMessage或PeekMessage函数来获得的。可以通过Windows的PostMessage函数来访问其它应用程序。&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; <br>BOOL&nbsp;&nbsp; PostThreadMessage(&nbsp;&nbsp; UINT&nbsp;&nbsp; message&nbsp;&nbsp; ,&nbsp;&nbsp; WPARAM&nbsp;&nbsp; wParam,&nbsp;&nbsp; LPARAMlParam&nbsp;&nbsp; );返回值如果成功，则返回非零值；否则返回0。&nbsp;&nbsp; <br>参数message用户自定义消息的ID。&nbsp;&nbsp; <br>wParam第一个消息参数。&nbsp;&nbsp; <br>lParam第二个消息参数。&nbsp;&nbsp; <br>说明：调用这个函数以向其它CWinThread对象发送一个用户自定义消息。发送的消息通过消息映射宏ON_THREAD_MESSAGE被映射到适当的消息处理函数。&nbsp;&nbsp;&nbsp;<br><br>3.同步方式：具体参见<a href="http://www.cppblog.com/andxie99/archive/2006/10/10/13517.html">http://www.cppblog.com/andxie99/archive/2006/10/10/13517.html</a>。<br><br><br></dt></dl>
<img src ="http://www.cppblog.com/amazon/aggbug/67989.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2008-11-27 16:30 <a href="http://www.cppblog.com/amazon/archive/2008/11/27/67989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Relationship: char, wchar_t, TCHAR, _T(), wstring, string</title><link>http://www.cppblog.com/amazon/archive/2008/11/27/67958.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Wed, 26 Nov 2008 16:56:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2008/11/27/67958.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/67958.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2008/11/27/67958.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/67958.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/67958.html</trackback:ping><description><![CDATA[初学C/C++，char, wchar_t, TCHAR, ACHAR, _T()这几个类型的差异和联系曾经让我很是头疼，在此做一下简单的归纳总结，希望能给各位刚入门的菜菜们一点帮助。<br><br>char :<br><br>单字节变量类型，最多表示256个字符，在ANSI C中包括：26 lowercase letters, 26 uppercase letters, 10 digits, 32 symbols, 33 control codes, and a space, for a total of 128 codes. <br><br>wchar_t :<br><br>宽字节变量类型，用于表示Unicode字符，它实际定义在&lt;string.h&gt;里：typedef unsigned short wchar_t。<br><br>定义宽字节类型方法如下：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">wchar_t&nbsp;c&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;`A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">&nbsp;;&nbsp;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">wchar_t&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">wchar_t&nbsp;a[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;;&nbsp;</span></div>
其中，宽字节类型每个变量占用2个字节，故上述数组a的sizeof(a) = 14。<br><br>TCHAR / _T( ) :<br><br>TCHAR.H provides a set of alternative names for the normal run-time library functions requiring string parameters (for example, _tprintf and _tcslen). These are sometimes referred to as "generic"function names because they can refer to either the Unicode or non-Unicode versions of the functions. TCHAR.H also solves the problem of the two character data types with a new data type named TCHAR.<br><br>如果在程序中既包括ANSI又包括Unicode编码，需要包括头文件tchar.h。TCHAR是定义在该头文件中的宏，它视你是否定义了_UNICODE宏而定义成：<br>定义了_UNICODE：&nbsp;&nbsp;&nbsp; typedef wchar_t TCHAR ; <br>没有定义_UNICODE： typedef char TCHAR ; <br><br>_T( )也是定义在该头文件中的宏，视是否定义了_UNICODE宏而定义成：<br>定义了_UNICODE：&nbsp;&nbsp;&nbsp; #define _T(x)&nbsp; L##x <br>没有定义_UNICODE： #define _T(x)&nbsp; x <br><br>注意：如果在程序中使用了TCHAR，那么就不应该使用ANSI的strXXX函数或者Unicode的wcsXXX函数了，而必须使用tchar.h中定义的_tcsXXX函数。<br>
<p>以strcpy函数为例子，总结一下：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果你想使用ANSI字符串，那么请使用这一套写法：</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;szString[</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">strcpy(szString,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果你想使用Unicode字符串，那么请使用这一套：</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">wchar_t&nbsp;szString[</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">wcscpy(szString,L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果你想通过定义_UNICODE宏，而编译ANSI或者Unicode字符串代码：</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">TCHAR&nbsp;szString[</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">_tcscpy(szString,_TEXT(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));</span></div>
<br>string / wstring :<br><br>string和wstring均定义在string头文件中，其中string类型变量中每个单元为char型字符，wstring为wchar_t型字符。<br>定义方法如下：<br>string str("abcd");<br>wstring wstr(L"中国人");<br><br><span style="COLOR: #ff0000">各转换方法：</span><br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">char*&nbsp;to&nbsp;string&nbsp;:&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">abcde</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;str&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;a;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">string&nbsp;to&nbsp;char*</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;str.c_str();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">wchar_t*&nbsp;to&nbsp;wstring</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">wchar_t&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">b&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">abcde</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">wstring&nbsp;wstr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;b;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">wstring&nbsp;to&nbsp;wchar_t*</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">wchar_t&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">b&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;wstr.c_str();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">wstring&nbsp;to&nbsp;string&nbsp;</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;ws2s(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::wstring</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;ws)<br><img id=Codehighlighter1_275_667_Open_Image onclick="this.style.display='none'; Codehighlighter1_275_667_Open_Text.style.display='none'; Codehighlighter1_275_667_Closed_Image.style.display='inline'; Codehighlighter1_275_667_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_275_667_Closed_Image onclick="this.style.display='none'; Codehighlighter1_275_667_Closed_Text.style.display='none'; Codehighlighter1_275_667_Open_Image.style.display='inline'; Codehighlighter1_275_667_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_275_667_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_275_667_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;curLocale&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;setlocale(LC_ALL,&nbsp;NULL);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_ALL,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">chs</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;wchar_t</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;_Source&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ws.c_str();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;_Dsize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;ws.size()&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">_Dest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[_Dsize];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(_Dest,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,_Dsize);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wcstombs(_Dest,_Source,_Dsize);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_Dest;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]_Dest;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_ALL,&nbsp;curLocale.c_str());<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;result;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">string&nbsp;to&nbsp;wstring</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">std::wstring&nbsp;s2ws(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;s)<br><img id=Codehighlighter1_730_1034_Open_Image onclick="this.style.display='none'; Codehighlighter1_730_1034_Open_Text.style.display='none'; Codehighlighter1_730_1034_Closed_Image.style.display='inline'; Codehighlighter1_730_1034_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_730_1034_Closed_Image onclick="this.style.display='none'; Codehighlighter1_730_1034_Closed_Text.style.display='none'; Codehighlighter1_730_1034_Open_Image.style.display='inline'; Codehighlighter1_730_1034_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_730_1034_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_730_1034_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_ALL,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">chs</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;_Source&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s.c_str();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;_Dsize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s.size()&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wchar_t&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">_Dest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;wchar_t[_Dsize];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wmemset(_Dest,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;_Dsize);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mbstowcs(_Dest,_Source,_Dsize);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::wstring&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_Dest;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]_Dest;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setlocale(LC_ALL,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;result;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<br><br><br><br>
<img src ="http://www.cppblog.com/amazon/aggbug/67958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2008-11-27 00:56 <a href="http://www.cppblog.com/amazon/archive/2008/11/27/67958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>