﻿<?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/aaxron/category/15295.html</link><description>记录修行的印记
</description><language>zh-cn</language><lastBuildDate>Sun, 21 Feb 2021 09:39:32 GMT</lastBuildDate><pubDate>Sun, 21 Feb 2021 09:39:32 GMT</pubDate><ttl>60</ttl><item><title>2、Pass a string to/from Java to/from CTag(s): JNI</title><link>http://www.cppblog.com/aaxron/archive/2019/12/06/217014.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 06 Dec 2019 02:53:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2019/12/06/217014.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/217014.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2019/12/06/217014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/217014.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/217014.html</trackback:ping><description><![CDATA[<div>Pass a string to/from Java to/from CTag(s): JNI</div><div>To Java from C (as seen from the previous How-to) :<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;"JavaHowTo.h"&nbsp;<br /><br />JNIEXPORT&nbsp;jstring&nbsp;JNICALL&nbsp;Java_JavaHowTo_sayHello<br />&nbsp;&nbsp;(JNIEnv&nbsp;*env,&nbsp;jobject&nbsp;obj)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;&nbsp;env-&gt;NewStringUTF("Hello&nbsp;world");<br />}<br />From&nbsp;Java&nbsp;to&nbsp;C&nbsp;:&nbsp;Suppose&nbsp;we&nbsp;have&nbsp;a&nbsp;Java&nbsp;Class<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyClass&nbsp;{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;sayHello(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;&nbsp;"Hello&nbsp;world&nbsp;From&nbsp;Java";<br />&nbsp;&nbsp;}<br />}</div><div>then from C, we want to call the Java sayHello() method which returns a String :</div><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->JNIEXPORT&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;JNICALL&nbsp;Java_JavaHowTo_sayHello(JNIEnv&nbsp;*env,&nbsp;jobject&nbsp;obj)&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*str;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;jclass&nbsp;myclass_class&nbsp;=(jclass)&nbsp;env-&gt;NewGlobalRef&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(env-&gt;FindClass&nbsp;("MyClass"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;we&nbsp;need&nbsp;the&nbsp;MyClass&nbsp;constructor&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jmethodID&nbsp;constructorID&nbsp;=&nbsp;env-&gt;GetMethodID<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(myclass_class,&nbsp;"",&nbsp;"()V");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;and&nbsp;the&nbsp;sayHello()&nbsp;method</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jmethodID&nbsp;methodID&nbsp;=&nbsp;env-&gt;GetMethodID<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(myclass_class,&nbsp;"sayHello",&nbsp;"()Ljava/lang/String;");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;instanciate&nbsp;a&nbsp;MyClass&nbsp;object</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jobject&nbsp;myclass_object&nbsp;=&nbsp;&nbsp;env-&gt;NewObject<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(myclass_class,&nbsp;constructorID);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;call&nbsp;the&nbsp;sayHello()&nbsp;method</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jstring&nbsp;s&nbsp;=&nbsp;(jstring)&nbsp;&nbsp;env-&gt;CallObjectMethod<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(myclass_object,&nbsp;methodID);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;convert&nbsp;the&nbsp;Java&nbsp;String&nbsp;to&nbsp;use&nbsp;it&nbsp;in&nbsp;C</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;str&nbsp;=&nbsp;env-&gt;GetStringUTFChars(s,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s"&nbsp;,&nbsp;str);<br />&nbsp;&nbsp;&nbsp;&nbsp;env-&gt;ReleaseStringUTFChars(s,&nbsp;str);&nbsp;&nbsp;<br />}</div><br /><div>The Java JNI wrapper would be</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span>&nbsp;JavaHowTo&nbsp;{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">native</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sayHello();<br />&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;System.loadLibrary("javahowto");&nbsp;<br />&nbsp;&nbsp;}<br />}</div><div>And finally, to use it</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;JNIJavaHowTo&nbsp;{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;JavaHowTo&nbsp;jht&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JavaHowTo();<br />&nbsp;&nbsp;&nbsp;&nbsp;jht.sayHello();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br /><br /><br /><br /><br /><br /><br /></div><img src ="http://www.cppblog.com/aaxron/aggbug/217014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2019-12-06 10:53 <a href="http://www.cppblog.com/aaxron/archive/2019/12/06/217014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>1、Use native code through JNI (HelloWorld)</title><link>http://www.cppblog.com/aaxron/archive/2019/12/06/217013.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 06 Dec 2019 02:50:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2019/12/06/217013.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/217013.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2019/12/06/217013.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/217013.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/217013.html</trackback:ping><description><![CDATA[<p style="margin:0in;font-family:微软雅黑;font-size:10.5pt"><a href="https://www.rgagnon.com/topics/java-jni.html">https://www.rgagnon.com/topics/java-jni.html</a></p>  <p style="margin:0in;font-family:微软雅黑;font-size:10.5pt">&nbsp;</p>  <p style="margin:0in;font-family:微软雅黑;font-size:10.5pt">Use native code through JNI (HelloWorld)</p>  <p style="margin:0in;font-family:微软雅黑;font-size:10.5pt">Use native code through JNITag(s): JNI</p>  <p style="margin:0in;font-family:微软雅黑;font-size:10.5pt">With MSVC6, create a new Win32 DLL project (simple) and call it javahowto.</p>  <span style="font-family: 微软雅黑; font-size: 10.5pt;">In the same directory create a java source called JavaHowTo.java</span>&nbsp;<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span>&nbsp;JavaHowTo&nbsp;{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">native</span>&nbsp;String&nbsp;sayHello();<br />&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;System.loadLibrary("javahowto");&nbsp;<br />&nbsp;&nbsp;}<br />}</div><div>Compile the Java program and use javah utility to generate the JavaHowTo.h header file.</div><div>javah -jni JavaHowTo</div><div>In MSVC6, add the JavaHowTo.h in your project header files</div><div>In the Tools - Options menu, set the include directories to include the Java JNI headers files. They are located in [jdk dir]\include and [jdk dir]\include\win32 directories</div><div>In the javahowto.cpp source, add</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;"JavaHowTo.h"&nbsp;<br /><br />JNIEXPORT&nbsp;jstring&nbsp;JNICALL&nbsp;Java_JavaHowTo_sayHello<br />&nbsp;&nbsp;(JNIEnv&nbsp;*env,&nbsp;jobject&nbsp;obj)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;&nbsp;env-&gt;NewStringUTF("Hello&nbsp;world");<br />}</div><div>Select the Release configuration and build the project.</div><div>Copy the javahowto.dll in the same directory as the java program.</div><div>Create this new java program<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;JNIJavaHowTo&nbsp;{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;JavaHowTo&nbsp;jht&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JavaHowTo();<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(jht.sayHello());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div></div><div>Compile and execute.</div><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/aaxron/aggbug/217013.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2019-12-06 10:50 <a href="http://www.cppblog.com/aaxron/archive/2019/12/06/217013.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++ traits(1)</title><link>http://www.cppblog.com/aaxron/archive/2016/10/14/214333.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 14 Oct 2016 06:18:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2016/10/14/214333.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/214333.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2016/10/14/214333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/214333.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/214333.html</trackback:ping><description><![CDATA[<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; width: 98%; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#pragma&nbsp;once<br />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;TraitsHelper;<br /><br />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;TraitsHelper&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;isPointer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">enum</span><span style="color: #000000">&nbsp;{IsPointer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">};<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;GetIsPointer()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;IsPointer;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};&nbsp;&nbsp;<br />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;TraitsHelper</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">*&gt;</span><span style="color: #000000">&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;isPointer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">enum</span><span style="color: #000000">&nbsp;{IsPointer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">};<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;GetIsPointer()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;IsPointer;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};&nbsp;&nbsp;<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">call</span><span style="color: #008000"><br /></span><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 /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_tmain(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;val&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pVal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">val;<br />&nbsp;&nbsp;&nbsp;&nbsp;TraitsHelper</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;TraitsHelper</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">*&gt;</span><span style="color: #000000">&nbsp;b;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;b1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a.IsPointer;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;b2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b.IsPointer;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;b3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a.GetIsPointer();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;b4&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;TraitsHelper</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">::IsPointer;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;b5&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;TraitsHelper</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">*&gt;</span><span style="color: #000000">::IsPointer;<br /><br /><br />&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 />}</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/214333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2016-10-14 14:18 <a href="http://www.cppblog.com/aaxron/archive/2016/10/14/214333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google Protocol Buffer 安装和使用</title><link>http://www.cppblog.com/aaxron/archive/2016/09/22/214289.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 22 Sep 2016 02:19:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2016/09/22/214289.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/214289.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2016/09/22/214289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/214289.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/214289.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->Google&nbsp;Protocol&nbsp;Buffer&nbsp;安装和使用<br />
下载：<br />
https://codeload.github.com/google/protobuf/<br />
<br />
看README.md<br />
<br />
For&nbsp;non-C++&nbsp;users,&nbsp;the&nbsp;simplest&nbsp;way&nbsp;to&nbsp;install&nbsp;the&nbsp;protocol&nbsp;compiler&nbsp;is&nbsp;to<br />
download&nbsp;a&nbsp;pre-built&nbsp;binary&nbsp;from&nbsp;our&nbsp;release&nbsp;page:<br />
<span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">https://github.com/google/protobuf/releases</span><span style="color: #800000; font-weight: bold; ">]</span><br />
<br />
<br />
下载C++的版本：<br />
https://github.com/google/protobuf/releases<br />
<br />
进入：protobuf-3.0.2\cmake&nbsp;目录<br />
用cmake&nbsp;处理编译<br />
<br />
编译默认的代码生成是MT，不是MD<br />
<br />
只需要2个工程：<br />
libprotobuf和protoc<br />
<br />
编译完成之后：把include目录拷贝出来<br />
<br />
新建SearchRequest.proto文件<br />
message&nbsp;SearchRequest&nbsp;<br />
{<br />
&nbsp;&nbsp;required&nbsp;string&nbsp;query&nbsp;=&nbsp;1<span style="color: #008000; ">;<br />
</span>&nbsp;&nbsp;optional&nbsp;int32&nbsp;page_number&nbsp;=&nbsp;2<span style="color: #008000; ">;</span><span style="color: #008000; ">//&nbsp;Which&nbsp;page&nbsp;number&nbsp;do&nbsp;we&nbsp;want?</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;optional&nbsp;int32&nbsp;result_per_page&nbsp;=&nbsp;3<span style="color: #008000; ">;</span><span style="color: #008000; ">//&nbsp;Number&nbsp;of&nbsp;results&nbsp;to&nbsp;return&nbsp;per&nbsp;page.</span><span style="color: #008000; "><br />
</span>}<br />
<br />
protoc.exe&nbsp;--cpp_out&nbsp;./&nbsp;SearchRequest.poto</div>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;"stdafx.h"<br />#include&nbsp;"SearchRequest.pb.h"<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">#pragma&nbsp;comment(lib,"../Debug/MT/libprotobufd.lib")</span><span style="color: #008000; "><br /></span>#pragma&nbsp;comment(lib,"../Debug/MD/libprotobufd.lib")<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;_tmain(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;_TCHAR*&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SearchRequest&nbsp;sr;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;sr.set_query("abcd",5);<br />&nbsp;&nbsp;&nbsp;&nbsp;sr.set_page_number(0x1001);<br />&nbsp;&nbsp;&nbsp;&nbsp;sr.set_result_per_page(0x1002);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::<span style="color: #0000FF; ">string</span>&nbsp;data&nbsp;&nbsp;=&nbsp;sr.SerializeAsString();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SearchRequest&nbsp;sr2;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;sr2.ParseFromString(data);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div>
<img src ="http://www.cppblog.com/aaxron/aggbug/214289.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2016-09-22 10:19 <a href="http://www.cppblog.com/aaxron/archive/2016/09/22/214289.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ CLI 可变参数</title><link>http://www.cppblog.com/aaxron/archive/2016/09/01/214249.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 01 Sep 2016 06:48:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2016/09/01/214249.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/214249.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2016/09/01/214249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/214249.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/214249.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">namespace</span>&nbsp;TK&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">enum</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;LogLevel&nbsp;{&nbsp;Kernel,&nbsp;Fatal,&nbsp;Error,&nbsp;Warning,&nbsp;Infomation,&nbsp;Debug};<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">ref</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;LogHelper<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;Open(String^&nbsp;filename);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;Write(LogLevel&nbsp;level,String^&nbsp;format,<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;array&lt;Object^&gt;^&nbsp;args);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;WriteLine(LogLevel&nbsp;level,String^&nbsp;format,<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;array&lt;Object^&gt;^&nbsp;args);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;SetLevel(LogLevel&nbsp;level);<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />}<br /><br /><br /><span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;MarshalString(String^&nbsp;net,&nbsp;CString&amp;&nbsp;os)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;LPCTSTR&nbsp;chars&nbsp;=&nbsp;(LPCTSTR)(Marshal::StringToHGlobalUni(net)).ToPointer();<br />&nbsp;&nbsp;&nbsp;&nbsp;os&nbsp;=&nbsp;chars;<br />&nbsp;&nbsp;&nbsp;&nbsp;Marshal::FreeHGlobal(IntPtr((<span style="color: #0000FF; ">void</span>*)chars));<br />}<br />#pragma&nbsp;unmanaged<br /><span style="color: #0000FF; ">static</span>&nbsp;CStringA&nbsp;CStrW2CStrA(<span style="color: #0000FF; ">const</span>&nbsp;CStringW&nbsp;&amp;cstrSrcW)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len&nbsp;=&nbsp;WideCharToMultiByte(CP_UTF8,&nbsp;0,&nbsp;LPCWSTR(cstrSrcW),&nbsp;-1,&nbsp;NULL,&nbsp;0,&nbsp;NULL,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*str&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">char</span>[len];<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(str,&nbsp;0,&nbsp;len);<br />&nbsp;&nbsp;&nbsp;&nbsp;WideCharToMultiByte(CP_UTF8,&nbsp;0,&nbsp;LPCWSTR(cstrSrcW),&nbsp;-1,&nbsp;str,&nbsp;len,&nbsp;NULL,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;CStringA&nbsp;cstrDestA&nbsp;=&nbsp;str;<br />&nbsp;&nbsp;&nbsp;&nbsp;delete[]&nbsp;str;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cstrDestA;<br />}<br />#pragma&nbsp;managed</div><img src ="http://www.cppblog.com/aaxron/aggbug/214249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2016-09-01 14:48 <a href="http://www.cppblog.com/aaxron/archive/2016/09/01/214249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>再学C++98 构造函数</title><link>http://www.cppblog.com/aaxron/archive/2016/08/12/214153.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 12 Aug 2016 07:30:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2016/08/12/214153.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/214153.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2016/08/12/214153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/214153.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/214153.html</trackback:ping><description><![CDATA[<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; width: 98%; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><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 /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_a;<br />&nbsp;&nbsp;&nbsp;&nbsp;Test(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a)&nbsp;:&nbsp;_a(a)&nbsp;{}<br />&nbsp;&nbsp;&nbsp;&nbsp;Test()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Test::Test(</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">结果正确</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test(</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">结果错误，_a&nbsp;随机</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #0000ff">this</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Test(</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">正确，但产生临时对象</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /><br /><br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_tmain(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Test&nbsp;obj;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,obj._a);<br />&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 />}<br /><br /><br /></span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Test::Test(</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">汇编</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Test::Test(</span><span style="color: #000000">0</span><span style="color: #000000">);<br />00BD1483&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;&nbsp;<br />00BD1485&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,dword&nbsp;ptr&nbsp;[</span><span style="color: #0000ff">this</span><span style="color: #000000">]&nbsp;&nbsp;<br />00BD1488&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test::Test&nbsp;(0BD101Eh)&nbsp;&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />Test(</span><span style="color: #000000">0</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">汇编&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test(</span><span style="color: #000000">0</span><span style="color: #000000">);<br /></span><span style="color: #000000">00031483</span><span style="color: #000000">&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;&nbsp;<br /></span><span style="color: #000000">00031485</span><span style="color: #000000">&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,[ebp</span><span style="color: #000000">-</span><span style="color: #000000">0D4h]&nbsp;&nbsp;<br />0003148B&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test::Test&nbsp;(3101Eh)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/214153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2016-08-12 15:30 <a href="http://www.cppblog.com/aaxron/archive/2016/08/12/214153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在vc中使用PCRE</title><link>http://www.cppblog.com/aaxron/archive/2016/03/02/212909.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 02 Mar 2016 02:04:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2016/03/02/212909.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/212909.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2016/03/02/212909.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/212909.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/212909.html</trackback:ping><description><![CDATA[<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">在vc中使用PCRE<br /></span><span style="color: #000000">1</span><span style="color: #000000">.&nbsp;PCRE简介<br />正则表达式(regular&nbsp;expression)，通常简写为regex、regexp或RE，使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。<br />PCRE(Perl&nbsp;Compatible&nbsp;Regular&nbsp;Expressions)，是一个函数库，由Philip&nbsp;Hazel开发，该函数库使用与Perl5一样的语法和语义实现了正则表达式的模式匹配功能。PCRE是免费开源的，它是由C语言实现。很多著名的开源软件如Apache、PHP、KDE、Nginx&nbsp;等都使用了PCRE。官方主页&#8211;http:</span><span style="color: #008000">//</span><span style="color: #008000">www.pcre.org，目前（2016.03）最新版本是8.38。</span><span style="color: #008000"><br /></span><span style="color: #000000"><br /></span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;编译&nbsp;PCRE<br />PCRE的作者Philip&nbsp;Hazel是在linux上工作的，所以编译PCRE最好的办法自然是configure,&nbsp;make,&nbsp;make&nbsp;install三步曲了。在windows下，&nbsp;cygwin或者MinGW都支持这么做。<br />在windows下编译&nbsp;PCRE要用CMake。<br />先从&nbsp;http:</span><span style="color: #008000">//</span><span style="color: #008000">www.cmake.org&nbsp;上下载最新版的CMake，</span><span style="color: #008000"><br /></span><span style="color: #000000">在解压缩后的PCRE目录下建个子目录build，比如我的D:\pcre</span><span style="color: #000000">-</span><span style="color: #000000">8.38</span><span style="color: #000000">\build。<br />设置要编译的源代码的路径以及编译好的二进制文件存放的路径<br />CMake&nbsp;会读取源代码目录下的文件&nbsp;CMakeLists.txt&nbsp;，然后将读到的配置以红颜色显示出来，此时可以根据我们的需要适当的选择或去掉一些配置，比如加上&nbsp;PCRE_SUPPORT_UTF，去掉PCRE_SUPPORT_JIT(不需要嵌入式的代码)、PCRE_BUILD_PCRECPP(我只想要c形式的库)；还可以修改一些配置的值，比如把PCRE_NEWLINE从LF改成CRLF。然后再点一下</span><span style="color: #000000">"</span><span style="color: #000000">Configure&#8221;,最后点</span><span style="color: #000000">"</span><span style="color: #000000">Generate&#8221;，你会发现在build目录里生成了一系列的vc6的工程文件以及一些.h文件和.c文件。<br /><br /></span><span style="color: #000000">3</span><span style="color: #000000">&nbsp;在工程中使用PCRE<br />包含头文件&nbsp;#include&nbsp;&#8220;pcre.h&#8221;<br />链接静态库&nbsp;#pragma&nbsp;comment(lib,&#8220;pcre.lib&#8221;)<br />在项目&#8221;预处理器定义&#8220;中加上PCRE_STATIC<br /><br />示例代码：<br />#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 /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;PCRE_STATIC</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">pcrecpp.h</span><span style="color: #000000">"</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">vector</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#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 />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#pragma&nbsp;comment(lib,</span><span style="color: #000000">"</span><span style="color: #000000">lib/pcrecppd.lib</span><span style="color: #000000">"</span><span style="color: #000000">)<br />#pragma&nbsp;comment(lib,</span><span style="color: #000000">"</span><span style="color: #000000">lib/pcred.lib</span><span style="color: #000000">"</span><span style="color: #000000">)<br /></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 /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;pcrecpp;<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Test1()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;OVECCOUNT&nbsp;30&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;should&nbsp;be&nbsp;a&nbsp;multiple&nbsp;of&nbsp;3&nbsp;*/</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;pcre&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">re;&nbsp;<br />&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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">error;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;erroffset;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ovector[OVECCOUNT];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc,&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src&nbsp;&nbsp;&nbsp;&nbsp;[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">111&nbsp;&lt;title&gt;Hello&nbsp;World&lt;/title&gt;&nbsp;222</span><span style="color: #000000">"</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pattern&nbsp;&nbsp;&nbsp;[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;title&gt;(.*)&lt;/title&gt;</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">String&nbsp;:&nbsp;%s\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;src);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Pattern:&nbsp;\</span><span style="color: #000000">"</span><span style="color: #000000">%</span><span style="color: #000000">s\</span><span style="color: #000000">"</span><span style="color: #000000">\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;pattern);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;re&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pcre_compile(pattern,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">error,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">erroffset,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(re&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">PCRE&nbsp;compilation&nbsp;failed&nbsp;at&nbsp;offset&nbsp;%d:&nbsp;%s\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;erroffset,&nbsp;error);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pcre_exec(re,&nbsp;NULL,&nbsp;src,&nbsp;strlen(src),&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;ovector,&nbsp;OVECCOUNT);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(rc&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(rc&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;PCRE_ERROR_NOMATCH)&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Sorry,&nbsp;no&nbsp;match&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Matching&nbsp;error&nbsp;%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;rc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(re);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">\nOK,&nbsp;has&nbsp;matched&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />\n\n</span><span style="color: #000000">"</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</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;rc;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br />&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">substring_start&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;src&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;ovector[</span><span style="color: #000000">2</span><span style="color: #000000">*</span><span style="color: #000000">i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;substring_length&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ovector[</span><span style="color: #000000">2</span><span style="color: #000000">*</span><span style="color: #000000">i</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;ovector[</span><span style="color: #000000">2</span><span style="color: #000000">*</span><span style="color: #000000">i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%2d:&nbsp;%.*s\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;i,&nbsp;substring_length,&nbsp;substring_start);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;free(re);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;<br />}<br /><br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Test1();<br />&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 />}&nbsp;&nbsp;<br /><br /><br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/212909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2016-03-02 10:04 <a href="http://www.cppblog.com/aaxron/archive/2016/03/02/212909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>printf "%.*s"</title><link>http://www.cppblog.com/aaxron/archive/2016/03/02/212908.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 02 Mar 2016 02:00:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2016/03/02/212908.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/212908.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2016/03/02/212908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/212908.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/212908.html</trackback:ping><description><![CDATA[<p>printf "%.*s"<br />小数点.后&#8220;*&#8221;表示输出位数，具体的数据来自参数表<br />printf格式字符串中，与宽度控制和精度控制有关的常量都可以换成变量，方法就是使用一个&#8220;*&#8221;代替那个常量，然后在后面提供变量给&#8220;*&#8221;。</p>
<p>同样，小数点.前也可以添加*，也要用户输入一个位宽值来代替，表示输出的字符所占位宽。</p>
<p>复制代码<br />#include &lt;cstdio&gt;<br />#include &lt;iostream&gt;</p>
<p>int main()<br />{&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; char *s = "this is test example";<br />&nbsp;&nbsp;&nbsp; int a,b;<br />&nbsp;&nbsp;&nbsp; printf("%.*s\n", 10, s);//这里的常量10就是给*号的,你也可以用一个变量来控制宽度<br />&nbsp;&nbsp;&nbsp; printf("%*.*s\n", 20, 10, s);//常量20控制输出所占位宽，也可以用一个变量控制<br />&nbsp;&nbsp;&nbsp; std::cin&gt;&gt;a&gt;&gt;b; //输入15 10<br />&nbsp;&nbsp;&nbsp; printf("%*.*s\n", a, b, s);//输出为：-----this is te<br />&nbsp;&nbsp;&nbsp; std::cin.get();<br />&nbsp;&nbsp;&nbsp; std::cin.ignore();//暂停程序执行<br />}<br />复制代码<br />输出结果为：</p>
<p>this is te</p>
<p>----------this is te//-代表空格</p>
<p>15&nbsp; 10 //输入</p>
<p>-----this is te</p>
<p>&nbsp;</p>
<p>注：printf的一般形式为printf("格式控制字符串",输出列表)，格式控制字符串形式为：[标志][输出最小宽度][.精度][长度]类型。</p>
<p>其中方括号[]中的项为可选项。 各项的意义介绍如下： <br />1)类型：类型字符用以表示输出数据的类型，其格式符和意义如下表所示： <br />d&nbsp; 以十进制形式输出带符号整数(正数不输出符号) <br />o&nbsp; 以八进制形式输出无符号整数(不输出前缀 0) <br />x,X&nbsp; 以十六进制形式输出无符号整数(不输出前缀 Ox) <br />u&nbsp; 以十进制形式输出无符号整数 <br />f&nbsp; 以小数形式输出单、双精度实数 <br />e,E&nbsp; 以指数形式输出单、双精度实数 <br />g,G&nbsp; 以%f 或%e 中较短的输出宽度输出单、双精度实数 <br />c&nbsp; 输出单个字符 <br />s&nbsp; 输出字符串 <br />2)标志：标志字符为-、+、#、空格四种，其意义下表所示： <br />-&nbsp; 结果左对齐，右边填空格 <br />+&nbsp; 输出符号(正号或负号) <br />空格&nbsp; 输出值为正时冠以空格，为负时冠以负号 <br />#&nbsp; 对 c,s,d,u类无影响；对 o 类,在输出时加前缀 o；对 x 类,在输出时加前缀 0x；对 e,g,f 类当结果有小数时才给出小数点 <br />3)输出最小宽度:用十进制整数来表示输出的最少位数。 若实际位数多于定义的宽度，则按实际位数输出，若实际位数少于定义的宽度则补以空格或 0。 <br />4)精度:精度格式符以&#8220;.&#8221;开头，后跟十进制整数。本项的意义是：如果输出数字，则表示小数的位数；如果输出的是字符，则表示输出字符的个数；若实际位数大于所定义的精度数，则截去超过的部分。 <br />5)长度:长度格式符为 h,l 两种，h 表示按短整型量输出，l 表示按长整型量输出。</p>
<p>转自：<a href="http://www.cnblogs.com/yuaqua/archive/2011/10/21/2219856.html">http://www.cnblogs.com/yuaqua/archive/2011/10/21/2219856.html</a></p><img src ="http://www.cppblog.com/aaxron/aggbug/212908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2016-03-02 10:00 <a href="http://www.cppblog.com/aaxron/archive/2016/03/02/212908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WM_COMMAND（BN_CLICKED）实现</title><link>http://www.cppblog.com/aaxron/archive/2016/01/20/212690.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 20 Jan 2016 03:23:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2016/01/20/212690.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/212690.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2016/01/20/212690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/212690.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/212690.html</trackback:ping><description><![CDATA[<div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;"stdafx.h"<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TestControl.c&nbsp;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">转自http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">www.cnblogs.com/memset/archive/2013/05/16/3081082.html&nbsp;，稍加修改</span><span style="color: #008000; "><br /></span><br /><span style="color: #0000FF; ">#define</span>&nbsp;_ATL_CSTRING_EXPLICIT_CONSTRUCTORS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;某些&nbsp;CString&nbsp;构造函数将是显式的</span><br />#include&nbsp;&lt;atlbase.h&gt;<br />#include&nbsp;&lt;atlstr.h&gt;<br /><br />#include&nbsp;&lt;WindowsX.h&gt;<br /><br />LRESULT&nbsp;CALLBACK&nbsp;ControlWindowProc(HWND&nbsp;hWnd,UINT&nbsp;uMsg,WPARAM&nbsp;wParam,LPARAM&nbsp;lParam);<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;RegisterControlClass(HINSTANCE&nbsp;hInstance)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WNDCLASSEXW&nbsp;wce={0};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;wce.cbSize&nbsp;=&nbsp;<span style="color: #0000FF; ">sizeof</span>(wce);<br />&nbsp;&nbsp;&nbsp;&nbsp;wce.hbrBackground&nbsp;=&nbsp;(HBRUSH)GetStockObject(WHITE_BRUSH);<br />&nbsp;&nbsp;&nbsp;&nbsp;wce.hInstance&nbsp;=&nbsp;hInstance;<br />&nbsp;&nbsp;&nbsp;&nbsp;wce.lpfnWndProc&nbsp;=&nbsp;ControlWindowProc;<br />&nbsp;&nbsp;&nbsp;&nbsp;wce.lpszClassName&nbsp;=&nbsp;L"ControlClass";<br />&nbsp;&nbsp;&nbsp;&nbsp;wce.style&nbsp;=&nbsp;CS_HREDRAW|CS_VREDRAW;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;RegisterClassExW(&amp;wce);<br /><br />}<br /><br /><br /><br />LRESULT&nbsp;CALLBACK&nbsp;ControlWindowProc(HWND&nbsp;hWnd,UINT&nbsp;uMsg,WPARAM&nbsp;wParam,LPARAM&nbsp;lParam)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;HBRUSH&nbsp;hbrBlack,hbrRed;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">switch</span>(uMsg)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;WM_CREATE:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hbrBlack&nbsp;=&nbsp;CreateSolidBrush(#000000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hbrRed&nbsp;=&nbsp;CreateSolidBrush(#ff0000);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;WM_PAINT:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PAINTSTRUCT&nbsp;ps;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HDC&nbsp;hdc;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hdc&nbsp;=&nbsp;BeginPaint(hWnd,&amp;ps);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(hdc,hbrBlack);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rectangle(hdc,0,0,100,50);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;text;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::GetWindowText(hWnd,text.GetBuffer(100),100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text.ReleaseBuffer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextOutW(hdc,10,10,text,text.GetLength());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndPaint(hWnd,&amp;ps);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;WM_LBUTTONDOWN:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HDC&nbsp;hdc;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hdc&nbsp;=&nbsp;GetDC(hWnd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(hdc,hbrRed);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rectangle(hdc,0,0,100,50);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetTextColor(hdc,#ff0000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;text;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::GetWindowText(hWnd,text.GetBuffer(100),100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text.ReleaseBuffer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextOutW(hdc,10,10,text,text.GetLength());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(hWnd,hdc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCapture(hWnd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;WM_LBUTTONUP:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HDC&nbsp;hdc;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hdc&nbsp;=&nbsp;GetDC(hWnd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectObject(hdc,hbrBlack);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rectangle(hdc,0,0,100,50);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetTextColor(hdc,#000000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;text;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::GetWindowText(hWnd,text.GetBuffer(100),100);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text.ReleaseBuffer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextOutW(hdc,10,10,text,text.GetLength());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(hWnd,hdc);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;bRet&nbsp;=&nbsp;&nbsp;(GetCapture()==hWnd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReleaseCapture();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HWND&nbsp;parent&nbsp;=&nbsp;::GetParent(hWnd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HMENU&nbsp;hMenu&nbsp;=&nbsp;::GetMenu(hWnd);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">POINT&nbsp;pt&nbsp;=&nbsp;MAKEPOINTS(lParam);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POINT&nbsp;pt&nbsp;=&nbsp;{&nbsp;GET_X_LPARAM(lParam),&nbsp;GET_Y_LPARAM(lParam)&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RECT&nbsp;rect;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::GetClientRect(hWnd,&amp;rect);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bRet&nbsp;=&nbsp;bRet&nbsp;&amp;&amp;&nbsp;::PtInRect(&amp;rect,pt);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(bRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::SendMessage(parent,WM_COMMAND,(WPARAM)hMenu,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;WM_DESTROY:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(hbrBlack);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(hbrRed);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;DefWindowProcW(hWnd,uMsg,wParam,lParam);<br />}<br /><br /><br />LRESULT&nbsp;CALLBACK&nbsp;MainWindowProc(HWND&nbsp;hWnd,UINT&nbsp;uMsg,WPARAM&nbsp;wParam,LPARAM&nbsp;lParam)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">switch</span>(uMsg)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;WM_CREATE:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HINSTANCE&nbsp;hInstance&nbsp;=&nbsp;GetModuleHandleW(NULL);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateWindowExW(0,L"Button",L"按键",WS_CHILD|WS_VISIBLE,0,0,100,50,hWnd,(HMENU)101,hInstance,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateWindowExW(0,L"ControlClass",L"哈哈",WS_CHILD|WS_VISIBLE,200,200,100,50,hWnd,(HMENU)100,hInstance,NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateWindowExW(0,L"ControlClass",L"呵呵",WS_CHILD|WS_VISIBLE,400,400,100,50,hWnd,(HMENU)102,hInstance,NULL);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;WM_COMMAND:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;wmId&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;LOWORD(wParam);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;msg;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg.Format(L"hWmd:0x%08x,wmId:%d",hWnd,wmId);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(hWnd,msg,L"提示",MB_OK|MB_ICONINFORMATION);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;WM_DESTROY:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostQuitMessage(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">default</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;DefWindowProcW(hWnd,uMsg,wParam,lParam);<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;WINAPI&nbsp;wWinMain(HINSTANCE&nbsp;hInstance,HINSTANCE&nbsp;hPrevInstance,LPWSTR&nbsp;lpCmdLine,<span style="color: #0000FF; ">int</span>&nbsp;nShowCmd)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;HWND&nbsp;hWnd;<br />&nbsp;&nbsp;&nbsp;&nbsp;WNDCLASSEXW&nbsp;wce&nbsp;=&nbsp;{0};<br />&nbsp;&nbsp;&nbsp;&nbsp;MSG&nbsp;msg;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;RegisterControlClass(hInstance);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;wce.cbSize&nbsp;=&nbsp;<span style="color: #0000FF; ">sizeof</span>(wce);<br />&nbsp;&nbsp;&nbsp;&nbsp;wce.hbrBackground&nbsp;=&nbsp;(HBRUSH)GetStockObject(WHITE_BRUSH);<br />&nbsp;&nbsp;&nbsp;&nbsp;wce.hCursor&nbsp;=&nbsp;LoadCursor(NULL,IDC_ARROW);<br />&nbsp;&nbsp;&nbsp;&nbsp;wce.hIcon&nbsp;=&nbsp;LoadIcon(NULL,IDI_APPLICATION);<br />&nbsp;&nbsp;&nbsp;&nbsp;wce.hInstance&nbsp;=&nbsp;hInstance;<br />&nbsp;&nbsp;&nbsp;&nbsp;wce.lpfnWndProc&nbsp;=&nbsp;MainWindowProc;<br />&nbsp;&nbsp;&nbsp;&nbsp;wce.lpszClassName&nbsp;=&nbsp;L"MyWindowClass";<br />&nbsp;&nbsp;&nbsp;&nbsp;wce.style&nbsp;=&nbsp;CS_HREDRAW|CS_VREDRAW;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;RegisterClassExW(&amp;wce);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;hWnd&nbsp;=&nbsp;CreateWindowExW(0,L"MyWindowClass",L"测试",WS_OVERLAPPEDWINDOW,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;UpdateWindow(hWnd);<br />&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow(hWnd,nShowCmd);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(GetMessageW(&amp;msg,NULL,0,0))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TranslateMessage(&amp;msg);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessageW(&amp;msg);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/aaxron/aggbug/212690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2016-01-20 11:23 <a href="http://www.cppblog.com/aaxron/archive/2016/01/20/212690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> [OOD-More C++ Idioms] 内部类 (Inner Class)</title><link>http://www.cppblog.com/aaxron/archive/2016/01/15/212660.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 15 Jan 2016 07:17:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2016/01/15/212660.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/212660.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2016/01/15/212660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/212660.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/212660.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp;[OOD-More&nbsp;C++&nbsp;Idioms]&nbsp;内部类&nbsp;(Inner&nbsp;Class)<br /><br />内部类&nbsp;(Inner&nbsp;Class)<br /><br />目的<br /><br />不用通过多重继承就可以实现多套接口,同时可以自然地向上转换(Up-casting)。<br />在单个抽象下提供相同接口的多个实现。<br />别名<br /><br />动机<br /><br />两个独立类库通过不同的接口提供的虚函数签名可能冲突，如果这时需要同时实现这两个函数就会出现问题。示例如下:<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;Base1&nbsp;&nbsp;<span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;来自月球</span><span style="color: #808080; "><br /></span>{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;open&nbsp;(<span style="color: #0000FF; ">int</span>)&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;virtual&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;~Base1()&nbsp;{}&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;不允许多态的析构函数</span><span style="color: #008000; "><br /></span>};<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;Base2&nbsp;&nbsp;<span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;来自木星</span><span style="color: #808080; "><br /></span>{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;open&nbsp;(<span style="color: #0000FF; ">int</span>)&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;virtual&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;~Base2()&nbsp;{}&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;不允许多态的析构函数</span><span style="color: #008000; "><br /></span>};<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;Derived&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Base1,&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Base2<br />{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;open&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Wow!&nbsp;到底来自哪里?</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;virtual&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;~Derived&nbsp;()&nbsp;{}<br />};<br /><br /><br />内部类惯用法就是用来解决这个问题。<br /><br />解决方案及示例<br /><br />仍然是上面的例子，两个基类不用修改，改用如下方式实现子类:<br /><br />#include&nbsp;&lt;iostream&gt;<br /><span style="color: #0000FF; ">class</span>&nbsp;Base1&nbsp;&nbsp;<span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;来自月球</span><span style="color: #808080; "><br /></span>{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;open&nbsp;(<span style="color: #0000FF; ">int</span>)&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;virtual&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;~Base1()&nbsp;{}&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;不允许多态的析构函数</span><span style="color: #008000; "><br /></span>};<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;Base2&nbsp;&nbsp;<span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;来自木星</span><span style="color: #808080; "><br /></span>{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;open&nbsp;(<span style="color: #0000FF; ">int</span>)&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;virtual&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;~Base2()&nbsp;{}&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;不允许多态的析构函数</span><span style="color: #008000; "><br /></span>};<br /><br /><span style="color: #0000FF; ">class</span>&nbsp;Derived&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;注意没有继承</span><span style="color: #008000; "><br /></span>{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Base1_Impl;<br />&nbsp;&nbsp;friend&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Base1_Impl;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;注意声明友元</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Base1_Impl&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Base1&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;注意是公共继承</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;Base1_Impl(Derived*&nbsp;p)&nbsp;:&nbsp;parent_(p)&nbsp;{}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;open()&nbsp;<span style="color: #0000FF; ">override</span>&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;parent_-&gt;base1_open();&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;Derived*&nbsp;parent_;<br />&nbsp;&nbsp;}&nbsp;base1_obj;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;注意成员变量.</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Base2_Impl;<br />&nbsp;&nbsp;friend&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Base2_Impl;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;注意声明友元</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Base2_Impl&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Base2&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;公共继承</span><span style="color: #008000; "><br /></span>&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;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;Base2_Impl(Derived*&nbsp;p)&nbsp;:&nbsp;parent_(p)&nbsp;{}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;open()&nbsp;<span style="color: #0000FF; ">override</span>&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;parent_-&gt;base2_open();&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;Derived*&nbsp;parent_;<br />&nbsp;&nbsp;}&nbsp;base2_obj;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;成员变量</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;base1_open()&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;111;&nbsp;}&nbsp;&nbsp;<span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;实现</span><span style="color: #808080; "><br /></span>&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;base2_open()&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;222;&nbsp;}&nbsp;&nbsp;<span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;实现</span><span style="color: #808080; "><br /></span><br />&nbsp;<span style="color: #0000FF; ">public</span>:<br /><br />&nbsp;&nbsp;Derived()&nbsp;:&nbsp;base1_obj(<span style="color: #0000FF; ">this</span>),&nbsp;base2_obj(<span style="color: #0000FF; ">this</span>)&nbsp;{}<br /><br />&nbsp;&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;Base1&amp;()&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;base1_obj;&nbsp;}&nbsp;&nbsp;<span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;转到Base1&amp;</span><span style="color: #808080; "><br /></span>&nbsp;&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;Base2&amp;()&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;base2_obj;&nbsp;}&nbsp;&nbsp;<span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;转到Base2&amp;</span><span style="color: #808080; "><br /></span><br />};&nbsp;<span style="color: #808080; ">///</span><span style="color: #008000; ">&nbsp;class&nbsp;Derived</span><span style="color: #808080; "><br /></span><br /><span style="color: #0000FF; ">int</span>&nbsp;base1_open(Base1&amp;&nbsp;b1)&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;b1.open();&nbsp;}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;base2_open(Base2&amp;&nbsp;b2)&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;b2.open();&nbsp;}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">void</span>)&nbsp;{<br />&nbsp;&nbsp;Derived&nbsp;d;<br />&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;base1_open(d)&nbsp;&lt;&lt;&nbsp;std::endl;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Like&nbsp;upcasting&nbsp;in&nbsp;inheritance.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;base2_open(d)&nbsp;&lt;&lt;&nbsp;std::endl;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Like&nbsp;upcasting&nbsp;in&nbsp;inheritance.</span><span style="color: #008000; "><br /></span>}<br /><br />附个类图便于理解:<br /><br />inner_class<br /><br />这里的类Derived并不是子类，而是通过内部的两个嵌套类实现不同的接口，再桥接回到自己定义的两个实现的函数：&nbsp;base1_open及base2_open。两个嵌套类不会共享继随关系，通过Derived类提供的两个转换操作符可以实现Derived转换到任意的基类。另外两个内部类对象也免去了额外的生命周期管理，它们的生命周期与Derived对象一致。<br /><br />已知的应用<br /><br />译注:&nbsp;<br />Inner&nbsp;Class的概念来自于Java,&nbsp;其本特征是嵌套类通过友元的方式可以使用外部类的私有成员变量和成员函数，从而支持更强的交互。而且通常这个内部类需要是私有的。&nbsp;<br />以Chromium网络模块的Http&nbsp;Cache为例:&nbsp;<br />sample<br /><br />这是一个简单的例子，并没有多重继承。更多的是强调了封装和信息隐藏(HttpCache::Transaction是HttpCache内私有的类)的OO特性。<br /><br />相关的惯用法<br /><br />Interface&nbsp;Class<br />Capability&nbsp;Query<br />参考<br /><br />Thinking&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;C++&nbsp;Vol&nbsp;2&nbsp;-&nbsp;Practical&nbsp;Programming&nbsp;&#8212;&nbsp;by&nbsp;Bruce&nbsp;Eckel.</div><img src ="http://www.cppblog.com/aaxron/aggbug/212660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2016-01-15 15:17 <a href="http://www.cppblog.com/aaxron/archive/2016/01/15/212660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++模板，判断是否存在成员函数，实现差异化操作 </title><link>http://www.cppblog.com/aaxron/archive/2016/01/15/212659.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 15 Jan 2016 07:01:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2016/01/15/212659.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/212659.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2016/01/15/212659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/212659.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/212659.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->工作中遇到一个问题，我有一个容器，装着各式各样的对象的指针，需要把拥有dump方法的指针内容dump出去，而对于没有dump方法的对象，直接忽略。<br /><br />首先想到的是给每个对象提供一个查询操作，从而得知是否拥有dump方法。显然这个方法不能让人满意，需要更改大量的class实现。C++如果我能自动判断某个类型是否拥有某方法，这个问题可以完美的解决，因为是否含有某方法编译期已经确定了，所以是有可能通过一些技巧来实现这个功能的。<br /><br />查阅了大量的模板偏特化，匹配失败不是错误，终于找到了Mr.Right:<br />废话不多说，贴代码：<br /><br />检测是否有定义&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;hello()：<br />点击(此处)折叠或打开<br />template&lt;typename&nbsp;T&gt;<br /><span style="color: #0000FF; ">struct</span>&nbsp;has_hello{<br />&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;U,&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(U::*)()&gt;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;HELPS;<br />&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;U&gt;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;Test(HELPS&lt;U,&nbsp;&amp;U::hello&gt;*);<br />&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;U&gt;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;Test(<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;Has&nbsp;=&nbsp;<span style="color: #0000FF; ">sizeof</span>(Test&lt;T&gt;(0))&nbsp;==&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">char</span>);<br />}<br />测试：<br />点击(此处)折叠或打开<br /><span style="color: #0000FF; ">struct</span>&nbsp;A<br />{<br />&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;hello(){<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"A&nbsp;is&nbsp;Hello."&lt;&lt;endl;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x;<br />};<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;cout&lt;&lt;"A&nbsp;has&nbsp;hello?&nbsp;"&lt;&lt;has_hello&lt;A&gt;::Has&lt;&lt;endl;<br />}<br /><br />&nbsp;has_hello&nbsp;能编译通过，而且能工作！！！<br /><br />解释：<br />template&lt;typename&nbsp;U&gt;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;Test(<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />);&nbsp;能匹配所有的类型U<br />template&lt;typename&nbsp;U,&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(U::*)()&gt;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;HELPS;&nbsp;当Type&nbsp;U有hello，且hello的类型为&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;(U::*)()时，模板HELPS&lt;U,&nbsp;&amp;U::hello&gt;能正确匹配，否则模板无法匹配<br /><br />Test&lt;T&gt;(0)&nbsp;&nbsp;优先匹配&nbsp;HELPS&lt;U,&nbsp;&amp;U::hello&gt;&nbsp;因为template&lt;typename&nbsp;U&gt;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;Test(HELPS&lt;U,&nbsp;&amp;U::hello&gt;*)&nbsp;是一个特化<br />sizeof操作符不需要计算表达式的值，是一个编译期的操作，定义指针类型可以只有声明没有定义<br />所以HELPS和Test都不需要实现，仅有声明就可以通过编译<br /><br />巧妙的探测了自定义类型A是否含有void&nbsp;U::hello()&nbsp;方法。<br /><br /><br />转自：http:<span style="color: #008000; ">//</span><span style="color: #008000; ">blog.chinaunix.net/xmlrpc.php?r=blog/article&amp;uid=17286628&amp;id=4643663<br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/212659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2016-01-15 15:01 <a href="http://www.cppblog.com/aaxron/archive/2016/01/15/212659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Visual C++ 8.0对象布局的奥秘：虚函数、多继承、虚拟继承</title><link>http://www.cppblog.com/aaxron/archive/2016/01/13/212651.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 13 Jan 2016 07:24:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2016/01/13/212651.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/212651.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2016/01/13/212651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/212651.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/212651.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->Visual&nbsp;C++&nbsp;8.0对象布局的奥秘：虚函数、多继承、虚拟继承<br />
<br />
哈哈，从M$&nbsp;Visual&nbsp;C++&nbsp;Team的Andy&nbsp;Rich那里又偷学到一招：VC8的隐含编译项/d1reportSingleClassLayout和/d1reportAllClassLayout&nbsp;。看个复杂的例子吧(如下)，现在假设我们想知道Derived类的对象布局，怎么办?&nbsp;在Project&nbsp;Properties-&gt;C++-&gt;Command&nbsp;Line-&gt;Additional&nbsp;Options里面加上/d1reportSingleClassLayoutDerived吧！<br />
<br />
<span style="color: #0000FF; ">class</span>&nbsp;CommonBase<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;co;<br />
};<br />
<br />
<span style="color: #0000FF; ">class</span>&nbsp;Base1:&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;CommonBase<br />
{<br />
<span style="color: #0000FF; ">public</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;print1()&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;print2()&nbsp;{}<br />
<span style="color: #0000FF; ">private</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;b1;<br />
};<br />
<br />
<span style="color: #0000FF; ">class</span>&nbsp;Base2:&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;CommonBase<br />
{<br />
<span style="color: #0000FF; ">public</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;dump1()&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;dump2()&nbsp;{}<br />
<span style="color: #0000FF; ">private</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;b2;<br />
};<br />
<br />
<span style="color: #0000FF; ">class</span>&nbsp;Derived:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Base1,&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Base2<br />
{<br />
<span style="color: #0000FF; ">public</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;print2()&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;dump2()&nbsp;{}<br />
<span style="color: #0000FF; ">private</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;d;<br />
};<br />
<br />
<span style="color: #0000FF; ">int</span>&nbsp;_tmain(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;_TCHAR*&nbsp;argv[])<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />
}<br />
<br />
F5编译之，你会惊奇地发现，Output里面有如下字样：<br />
<br />
&nbsp;1&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Derived&nbsp;size(32):<br />
&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;+---<br />
&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;+---&nbsp;(<span style="color: #0000FF; ">base</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Base1)<br />
&nbsp;4&nbsp;&nbsp;0&nbsp;|&nbsp;|&nbsp;{vfptr}<br />
&nbsp;5&nbsp;&nbsp;4&nbsp;|&nbsp;|&nbsp;{vbptr}<br />
&nbsp;6&nbsp;&nbsp;8&nbsp;|&nbsp;|&nbsp;b1<br />
&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;+---<br />
&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;+---&nbsp;(<span style="color: #0000FF; ">base</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Base2)<br />
&nbsp;9&nbsp;12&nbsp;|&nbsp;|&nbsp;{vfptr}<br />
10&nbsp;16&nbsp;|&nbsp;|&nbsp;{vbptr}<br />
11&nbsp;20&nbsp;|&nbsp;|&nbsp;b2<br />
12&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;+---<br />
13&nbsp;24&nbsp;|&nbsp;d<br />
14&nbsp;&nbsp;&nbsp;&nbsp;+---<br />
15&nbsp;&nbsp;&nbsp;&nbsp;+---&nbsp;(<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">base</span>&nbsp;CommonBase)<br />
16&nbsp;28&nbsp;|&nbsp;co<br />
17&nbsp;&nbsp;&nbsp;&nbsp;+---<br />
18&nbsp;<br />
19&nbsp;Derived::$vftable@Base1@:<br />
20&nbsp;&nbsp;0&nbsp;|&nbsp;&amp;Base1::print1<br />
21&nbsp;&nbsp;1&nbsp;|&nbsp;&amp;Derived::print2<br />
22&nbsp;<br />
23&nbsp;Derived::$vftable@Base2@:<br />
24&nbsp;&nbsp;0&nbsp;|&nbsp;&amp;Base2::dump1<br />
25&nbsp;&nbsp;1&nbsp;|&nbsp;&amp;Derived::dump2<br />
26&nbsp;<br />
27&nbsp;Derived::$vbtable@Base1@:<br />
28&nbsp;&nbsp;0&nbsp;|&nbsp;-4<br />
29&nbsp;&nbsp;1&nbsp;|&nbsp;24&nbsp;(Derivedd(Base1+4)CommonBase)<br />
30&nbsp;<br />
31&nbsp;Derived::$vbtable@Base2@:<br />
32&nbsp;&nbsp;0&nbsp;|&nbsp;-4<br />
33&nbsp;&nbsp;1&nbsp;|&nbsp;12&nbsp;(Derivedd(Base2+4)CommonBase)<br />
34&nbsp;<br />
35&nbsp;Derived::print2&nbsp;<span style="color: #0000FF; ">this</span>&nbsp;adjustor:&nbsp;0<br />
36&nbsp;Derived::dump2&nbsp;<span style="color: #0000FF; ">this</span>&nbsp;adjustor:&nbsp;12<br />
<br />
看到了吗?&nbsp;VC8居然输出了Derived对象的完整布局!&nbsp;我们终于可以不必两眼一抹黑般的去peek/poke了<img src="http://www.cppblog.com/Images/dot.gif" alt="" />.第1行表明，Derived对象总占用了32字节；其由三部分组成，分别是行3-行7、行8-行12、行13、行28；其中前二者分别是基类Base1、Base2的布局，最后的行28为虚拟基类Common的布局。<br />
<br />
以基类Base1部分为例，可发现其由一个虚函数表指针vftable和虚基表指针vbtable构成，先看Base1部分的vftable所指向的虚表$vftable@Base1(行19)，不难发现，其中的表项2已经被Derived::print2给override了；再来看Base2部分的vftable所指向的虚表$vftable@Base2(行23)，可发现，同样的，Base2::dump2被Derived::dump2给override了。这不明摆着就是虚函数机制嘛，heh~<br />
<br />
值得注意的是，这个例子同时说明，多继承场合下，其实在单一对象中是存在多个this指针的<img src="http://www.cppblog.com/Images/dot.gif" alt="" />.行35-36给出了如何将Derived的this指针校正为其基类子对象this指针的偏移量，也就是说，根据行36，假设有个Derived&nbsp;d，那么d.dump1()实际上应该理解成通过虚表$vftable@Base2对((Base2*)(((<span style="color: #0000FF; ">char</span>*)&amp;d)+12))-&gt;dump1()的调用<img src="http://www.cppblog.com/Images/dot.gif" alt="" />.即传递给所有Base2成员函数的this指针应该是(Base2*)((<span style="color: #0000FF; ">char</span>*)(&amp;d)+12)，这里可能我写得恐怖了点，意思到了就成<img src="http://www.cppblog.com/Images/dot.gif" alt="" />.这不，普通继承、多继承、对象Slicing的语义都在这个布局里面了，看仔细了哈~<br />
<br />
OK，多继承看完了，继续看虚拟基类是如何布局的。虚基Common在Derived的布局中，位于Derived本身数据成员之后的位置。Base1、Base2中均保存了一个vbtable指针，其分别指向各自所使用的虚基表$vbtable@Base1和$vbtable@Base2，为什么要指向一个虚基表?&nbsp;很简单，因为Base1、Base2有可能会同时继承多个不同的虚拟基类<img src="http://www.cppblog.com/Images/dot.gif" alt="" />..这充分体现了C++对象布局的复杂性<img src="http://www.cppblog.com/Images/dot.gif" alt="" />.在每个虚基表中，保存了所继承的虚拟基类部分相对于子类部分vbtable指针的偏移值，以Base2为例，我们知道Base2的vbtable在Derived中的偏移值为16(行10)，则根据$vbtable@Base2，虚基Common部分距离Base2&nbsp;vbtable指针的偏移值为12,则有虚基Common在Derived中的总偏移值为16+12。与普通多继承同理，我们在调用非虚拟的虚基成员函数时，必须将Derived的this指针调整为指向虚基部分的this指针，只有这样才能成功地访问虚基自身的数据成员和虚基的虚拟函数(通过虚基自己的vftable，为简单起见，上例中我就没弄那么复杂了，大家可以自己玩玩，明白如何举一反三即可)<br />
<br />
看完了上述解释，是不是感觉比啃Inside&nbsp;C++&nbsp;Object&nbsp;Model来得更快更直观啊？heh</div>
转:http://www.cnblogs.com/neoragex2002/archive/2007/11/01/VC8_Object_Layout_Secret.html<img src ="http://www.cppblog.com/aaxron/aggbug/212651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2016-01-13 15:24 <a href="http://www.cppblog.com/aaxron/archive/2016/01/13/212651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 设计模式之（观察者模式）</title><link>http://www.cppblog.com/aaxron/archive/2016/01/11/212643.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 11 Jan 2016 08:34:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2016/01/11/212643.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/212643.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2016/01/11/212643.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/212643.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/212643.html</trackback:ping><description><![CDATA[<div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">//</span><span style="color: #008000; ">UiBase.h</span><span style="color: #008000; "><br />
</span>#pragma&nbsp;once<br />
#include&nbsp;&lt;list&gt;<br />
<br />
<span style="color: #0000FF; ">namespace</span>&nbsp;dui<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;std::list;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;Event<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>*&nbsp;&nbsp;&nbsp;&nbsp;sender;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;argl;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;&nbsp;&nbsp;&nbsp;argu;<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;IControl{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;OnCreate(Event*&nbsp;_event)=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">virtual&nbsp;bool&nbsp;OnPaint(Event*&nbsp;_event)=0;</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;};<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;(IControl::*EVENT_PROC)(Event*);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;EventManager<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;Notify(EVENT_PROC&nbsp;method,Event*&nbsp;_event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;AddNotifier(IControl*&nbsp;control);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;RemoveNotifier(IControl*&nbsp;control);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&lt;IControl*&gt;&nbsp;m_ctrls;<br />
&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Button:<span style="color: #0000FF; ">public</span>&nbsp;IControl&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;OnCreate(Event*&nbsp;_event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">virtual&nbsp;bool&nbsp;OnPaint(Event*&nbsp;_event);</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Edit:<span style="color: #0000FF; ">public</span>&nbsp;IControl&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;OnCreate(Event*&nbsp;_event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">virtual&nbsp;bool&nbsp;OnPaint(Event*&nbsp;_event);</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;<br />
<br />
<br />
<br />
}</div>
<br />
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000; ">//</span><span style="color: #008000; ">UiBase.cpp</span><span style="color: #008000; "><br />
</span>#include&nbsp;"stdafx.h"<br />
#include&nbsp;"UiBase.h"&nbsp;<br />
<br />
<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;dui;<br />
<br />
<span style="color: #0000FF; ">void</span>&nbsp;EventManager::AddNotifier(IControl*&nbsp;control)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_ctrls.push_back(control);<br />
}<br />
<span style="color: #0000FF; ">void</span>&nbsp;EventManager::RemoveNotifier(IControl*&nbsp;control)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;list&lt;IControl*&gt;::iterator&nbsp;iter;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(iter&nbsp;=&nbsp;m_ctrls.begin();iter!=m_ctrls.end();)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(&nbsp;*iter&nbsp;==&nbsp;control){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter&nbsp;=&nbsp;m_ctrls.erase(iter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<span style="color: #0000FF; ">bool</span>&nbsp;EventManager::Notify(EVENT_PROC&nbsp;method,Event*&nbsp;_event)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("\r\n\r\nEventManager::Notify()&nbsp;Entry\r\n--------------------------------------\r\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;list&lt;IControl*&gt;::iterator&nbsp;iter;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(iter&nbsp;=&nbsp;m_ctrls.begin();iter!=m_ctrls.end();iter++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*iter-&gt;*method)(_event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">if&nbsp;(!(*iter-&gt;*method)(_event))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />
}&nbsp;&nbsp;<br />
<br />
<span style="color: #0000FF; ">bool</span>&nbsp;Button::OnCreate(Event*&nbsp;_event){&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("Button&nbsp;OnCreate()&nbsp;Entry,event.type=%d&nbsp;\r\n",_event-&gt;type);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />
}&nbsp;<br />
<br />
<span style="color: #0000FF; ">bool</span>&nbsp;Edit::OnCreate(Event*&nbsp;_event){&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("Edit&nbsp;OnCreate()&nbsp;Entry,event.type=%d&nbsp;\r\n",_event-&gt;type);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />
} &nbsp;</div>
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">Main.cpp</span><span style="color: #008000; "><br /></span><br />#include&nbsp;"stdafx.h"<br /><br />#include&nbsp;"UiBase.h"&nbsp;&nbsp;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;_tmain()<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;dui;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Event&nbsp;_event;<br />&nbsp;&nbsp;&nbsp;&nbsp;_event.type&nbsp;=&nbsp;0x1001;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;EventManager&nbsp;event_manager;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Button*&nbsp;btn&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Button();<br />&nbsp;&nbsp;&nbsp;&nbsp;event_manager.AddNotifier(btn);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Edit*&nbsp;edit&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Edit();<br />&nbsp;&nbsp;&nbsp;&nbsp;event_manager.AddNotifier(edit);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;event_manager.Notify(&amp;IControl::OnCreate,&amp;_event);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;event_manager.RemoveNotifier(btn);<br />&nbsp;&nbsp;&nbsp;&nbsp;event_manager.Notify(&amp;IControl::OnCreate,&amp;_event);<br />&nbsp;&nbsp;&nbsp;&nbsp;system("pause");&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;&nbsp;&nbsp;<br />}&nbsp;</div><img src ="http://www.cppblog.com/aaxron/aggbug/212643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2016-01-11 16:34 <a href="http://www.cppblog.com/aaxron/archive/2016/01/11/212643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>char*和wchar_t* 转String^</title><link>http://www.cppblog.com/aaxron/archive/2015/12/21/212530.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 21 Dec 2015 11:07:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2015/12/21/212530.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/212530.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2015/12/21/212530.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/212530.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/212530.html</trackback:ping><description><![CDATA[<div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">#include</span>&nbsp;"stdafx.h"<br /><span style="color: #0000ff;">#include&nbsp;</span>&lt;msclr/marshal.h&gt;<br /><span style="color: #0000ff;">#</span><span style="color: #0000FF; ">using</span>&nbsp;&lt;mscorlib.dll&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;System;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;System::Text;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;System::Runtime::InteropServices;<br /><br />#ifdef&nbsp;_MANAGED<br /><span style="color: #0000FF; ">#endif</span><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;abc123()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;msclr::interop;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;msg1&nbsp;=&nbsp;"Test&nbsp;String&nbsp;to&nbsp;Marshal";<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;wchar_t*&nbsp;msg2=&nbsp;L"Good&nbsp;Luck&nbsp;Aaron";<br />&nbsp;&nbsp;&nbsp;&nbsp;String^&nbsp;aMsg&nbsp;=&nbsp;marshal_as&lt;String^&gt;(msg1);<br />&nbsp;&nbsp;&nbsp;&nbsp;String^&nbsp;uMsg&nbsp;=&nbsp;marshal_as&lt;String^&gt;(msg2);<br />&nbsp;&nbsp;&nbsp;&nbsp;Console::WriteLine(aMsg);<br />&nbsp;&nbsp;&nbsp;&nbsp;Console::WriteLine(uMsg);<br />}<br /><span style="color: #0000ff;">#pragma</span><span style="color: #0000ff;">&nbsp;unmanaged</span><br /><span style="color: #0000FF; ">int</span>&nbsp;_tmain(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;_TCHAR*&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;abc123();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000;">system(</span>"pause");<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><span style="color: #0000ff;">#pragma&nbsp;managed&nbsp;</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/212530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2015-12-21 19:07 <a href="http://www.cppblog.com/aaxron/archive/2015/12/21/212530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pin_ptr 和 interior_ptr</title><link>http://www.cppblog.com/aaxron/archive/2015/12/21/212528.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 21 Dec 2015 09:11:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2015/12/21/212528.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/212528.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2015/12/21/212528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/212528.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/212528.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->CLR语法中，值类型指针分为两种类型：V*（限于非&nbsp;CLR&nbsp;堆位置）和内部指针&nbsp;interior_ptr&lt;V&gt;（允许但不要求托管堆内的地址）。<br /><br /><br />钉住指针<br />通常，在压缩阶段，垃圾回收器可选择将驻留在&nbsp;CLR&nbsp;堆上的对象移动到堆内的不同位置。这种移动对于跟踪句柄、跟踪引用和内部指针而言不是问题，它们都透明地更新这些实体。但是，如果用户在运行时环境外传递了&nbsp;CLR&nbsp;堆上对象的地址，这种移动就会导致问题。在这种情况下，对象的不稳定运动可能导致运行时失败。要避免此类对象的移动，必须在本地将它们钉在自己的位置上以供外部使用。<br /><br />在托管扩展中，&#8220;钉住指针&#8221;是通过使用&nbsp;__pin&nbsp;关键字限定指针声明来声明的。下面是一个来自托管扩展规范的经过略微修改的示例：<br /><br />&nbsp;&nbsp;复制代码&nbsp;<br />__gc&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;H&nbsp;{&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j;&nbsp;};<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;H&nbsp;*&nbsp;h&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;H;<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;__pin&nbsp;*&nbsp;k&nbsp;=&nbsp;&amp;&nbsp;h&nbsp;-&gt;&nbsp;j;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&#8230;</span><span style="color: #008000; "><br /></span>};<br />&nbsp;<br /><br />在新的语言设计中，钉住指针是使用类似于内部指针的语法来声明的。<br /><br />&nbsp;&nbsp;复制代码&nbsp;<br /><span style="color: #0000FF; ">ref</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;H<br />{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j;<br />};<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;H^&nbsp;h&nbsp;=&nbsp;gcnew&nbsp;H;<br />&nbsp;&nbsp;&nbsp;pin_ptr&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;k&nbsp;=&nbsp;&amp;h-&gt;j;<br /><br />&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&#8230;</span><span style="color: #008000; "><br /></span>}<br /><br /><br /><br />interior_ptr<br />Declares&nbsp;a&nbsp;pointer&nbsp;to&nbsp;inside&nbsp;a&nbsp;reference&nbsp;type,&nbsp;but&nbsp;not&nbsp;to&nbsp;the&nbsp;<span style="color: #0000FF; ">object</span>&nbsp;itself.&nbsp;An&nbsp;interior&nbsp;pointer&nbsp;can&nbsp;point&nbsp;to&nbsp;a&nbsp;reference&nbsp;handle,&nbsp;value&nbsp;type,&nbsp;boxed&nbsp;type&nbsp;handle,&nbsp;member&nbsp;of&nbsp;a&nbsp;managed&nbsp;type,&nbsp;or&nbsp;to&nbsp;an&nbsp;element&nbsp;of&nbsp;a&nbsp;managed&nbsp;array.&nbsp;<br />cli::interior_ptr&lt;cv_qualifier&nbsp;type&gt;&nbsp;var&nbsp;=&nbsp;&amp;initializer;<br /><br />Remarks<br />A&nbsp;native&nbsp;pointer&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;not&nbsp;able&nbsp;to&nbsp;track&nbsp;an&nbsp;item&nbsp;<span style="color: #0000FF; ">as</span>&nbsp;its&nbsp;location&nbsp;changes&nbsp;on&nbsp;the&nbsp;managed&nbsp;heap,&nbsp;which&nbsp;results&nbsp;from&nbsp;the&nbsp;garbage&nbsp;collector&nbsp;moving&nbsp;instances&nbsp;of&nbsp;an&nbsp;<span style="color: #0000FF; ">object</span>.&nbsp;In&nbsp;order&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;a&nbsp;pointer&nbsp;to&nbsp;correctly&nbsp;refer&nbsp;to&nbsp;the&nbsp;instance,&nbsp;the&nbsp;runtime&nbsp;needs&nbsp;to&nbsp;update&nbsp;the&nbsp;pointer&nbsp;to&nbsp;the&nbsp;newly&nbsp;positioned&nbsp;<span style="color: #0000FF; ">object</span>.<br /><br />An&nbsp;interior_ptr&nbsp;represents&nbsp;a&nbsp;superset&nbsp;of&nbsp;the&nbsp;functionality&nbsp;of&nbsp;a&nbsp;native&nbsp;pointer.&nbsp;Therefore,&nbsp;anything&nbsp;that&nbsp;can&nbsp;be&nbsp;assigned&nbsp;to&nbsp;a&nbsp;native&nbsp;pointer&nbsp;can&nbsp;also&nbsp;be&nbsp;assigned&nbsp;to&nbsp;an&nbsp;interior_ptr.&nbsp;An&nbsp;interior&nbsp;pointer&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;permitted&nbsp;to&nbsp;perform&nbsp;the&nbsp;same&nbsp;<span style="color: #0000FF; ">set</span>&nbsp;of&nbsp;operations&nbsp;<span style="color: #0000FF; ">as</span>&nbsp;native&nbsp;pointers,&nbsp;including&nbsp;comparison&nbsp;and&nbsp;pointer&nbsp;arithmetic.<br /><br />An&nbsp;interior&nbsp;pointer&nbsp;can&nbsp;only&nbsp;be&nbsp;declared&nbsp;on&nbsp;the&nbsp;stack.&nbsp;An&nbsp;interior&nbsp;pointer&nbsp;cannot&nbsp;be&nbsp;declared&nbsp;<span style="color: #0000FF; ">as</span>&nbsp;a&nbsp;member&nbsp;of&nbsp;a&nbsp;<span style="color: #0000FF; ">class</span>.<br /><br />Since&nbsp;interior&nbsp;pointers&nbsp;exist&nbsp;only&nbsp;on&nbsp;the&nbsp;stack,&nbsp;taking&nbsp;the&nbsp;address&nbsp;of&nbsp;an&nbsp;interior&nbsp;pointer&nbsp;yields&nbsp;an&nbsp;unmanaged&nbsp;pointer.<br /><br />interior_ptr&nbsp;has&nbsp;an&nbsp;<span style="color: #0000FF; ">implicit</span>&nbsp;conversion&nbsp;to&nbsp;<span style="color: #0000FF; ">bool</span>,&nbsp;which&nbsp;allows&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;its&nbsp;use&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;conditional&nbsp;statements.<br /><br />For&nbsp;information&nbsp;on&nbsp;how&nbsp;to&nbsp;declare&nbsp;an&nbsp;interior&nbsp;pointer&nbsp;that&nbsp;points&nbsp;into&nbsp;an&nbsp;<span style="color: #0000FF; ">object</span>&nbsp;that&nbsp;cannot&nbsp;be&nbsp;moved&nbsp;on&nbsp;the&nbsp;garbage-collected&nbsp;heap,&nbsp;see&nbsp;pin_ptr.<br /><br />interior_ptr&nbsp;<span style="color: #0000FF; ">is</span>&nbsp;<span style="color: #0000FF; ">in</span>&nbsp;the&nbsp;cli&nbsp;<span style="color: #0000FF; ">namespace</span>.&nbsp;See&nbsp;cli&nbsp;Namespace&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;more&nbsp;information.<br /><br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">Example<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;interior_ptr.cpp<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;compile&nbsp;with:&nbsp;/clr</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;System;<br /><br /><span style="color: #0000FF; ">ref</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyClass&nbsp;{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;data;<br />};<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />&nbsp;&nbsp;&nbsp;MyClass&nbsp;^&nbsp;h_MyClass&nbsp;=&nbsp;gcnew&nbsp;MyClass;<br />&nbsp;&nbsp;&nbsp;h_MyClass-&gt;data&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;Console::WriteLine(h_MyClass-&gt;data);<br /><br />&nbsp;&nbsp;&nbsp;interior_ptr&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;p&nbsp;=&nbsp;&amp;(h_MyClass-&gt;data);<br />&nbsp;&nbsp;&nbsp;*p&nbsp;=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;Console::WriteLine(h_MyClass-&gt;data);<br /><br />&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;alternatively</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;interior_ptr&lt;MyClass&nbsp;^&gt;&nbsp;p2&nbsp;=&nbsp;&amp;h_MyClass;<br />&nbsp;&nbsp;&nbsp;(*p2)-&gt;data&nbsp;=&nbsp;3;<br />&nbsp;&nbsp;&nbsp;Console::WriteLine((*p2)-&gt;data);<br />}<br /><br />&nbsp;<br /><br /><br />&nbsp;</div><img src ="http://www.cppblog.com/aaxron/aggbug/212528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2015-12-21 17:11 <a href="http://www.cppblog.com/aaxron/archive/2015/12/21/212528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用的字符串处理函数</title><link>http://www.cppblog.com/aaxron/archive/2015/12/14/212479.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 14 Dec 2015 12:33:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2015/12/14/212479.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/212479.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2015/12/14/212479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/212479.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/212479.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&#9670;&nbsp;常用的字符串处理函数，具体信息见MSDN：<br /><br />字符串长度：<br />&#9679;&nbsp;Ansi：strlen(<span style="color: #0000FF; ">char</span>&nbsp;*str);　　　　　　　　　　　　　　　　<br />&#9679;&nbsp;Unicode：wcslen(wchar_t&nbsp;*str);<br />&#9679;&nbsp;通用函数：_tcslen(TCHAR&nbsp;*str);<br /><br />&nbsp;<br /><br />&#9679;&nbsp;Ansi：<span style="color: #0000FF; ">int</span>&nbsp;atoi(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*str);　　　　　　　　　　　　<br />&#9679;&nbsp;Unicode：<span style="color: #0000FF; ">int</span>&nbsp;_wtoi(<span style="color: #0000FF; ">const</span>&nbsp;wchar_t&nbsp;*str);<br />&#9679;&nbsp;通用函数：_tstoi(<span style="color: #0000FF; ">const</span>&nbsp;TCHAR&nbsp;*str);<br /><br />&nbsp;<br /><br />字符串拷贝：<br />&#9679;&nbsp;Ansi：strcpy(<span style="color: #0000FF; ">char</span>&nbsp;*strDestination,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*strSource);&nbsp;<br />&#9679;&nbsp;Unicode：wcscpy(wchar_t&nbsp;*strDestination,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;wchar_t&nbsp;*strSource);<br />&#9679;&nbsp;通用函数：_tcscpy(TCHAR&nbsp;*strDestination,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;TCHAR&nbsp;*strSource);<br />&nbsp;<br /><br />以上函数不安全，在vs2003等以上版本的编译器中会有warnning警告提示，以下为安全函数（vc++6.0不支持）：<br />&#9679;&nbsp;Ansi：strcpy_s(<span style="color: #0000FF; ">char</span>&nbsp;*strDestination,&nbsp;size_t&nbsp;numberOfElements,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*strSource);<br />&#9679;&nbsp;Unicode：wcscpy_s(wchar_t&nbsp;*strDestination,&nbsp;size_t&nbsp;numberOfElements,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;wchar_t&nbsp;*strSource);<br />&#9679;&nbsp;通用函数：_tcscpy_s(TCHAR&nbsp;*strDestination,&nbsp;size_t&nbsp;numberOfElements,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;TCHAR&nbsp;*strSource);<br />&nbsp;<br /><br />numberOfElements&nbsp;Size&nbsp;of&nbsp;the&nbsp;destination&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;buffer.&nbsp;目的缓冲区的大小，以字节为单位，不是字符！<br /><br />&nbsp;<br /><br />size_t&nbsp;unsigned&nbsp;integer，在MSDN中的解释：Result&nbsp;of&nbsp;<span style="color: #0000FF; ">sizeof</span>&nbsp;<span style="color: #0000FF; ">operator</span>，也就是说&nbsp;size_t&nbsp;是&nbsp;unsigned&nbsp;integer&nbsp;即无符号整数。那为什么会有size_t这个类型呢？&nbsp;因为不同平台的操作系统(32/64)中&nbsp;<span style="color: #0000FF; ">int</span>/<span style="color: #0000FF; ">long</span>&nbsp;等类型所占的字节并不一样，而&nbsp;size_t&nbsp;在不同的平台下有不同的定义。有点类似于TCHAR类型：<br /><br />#ifndef&nbsp;&nbsp;&nbsp;_SIZE_T_DEFINED&nbsp;&nbsp;<br />　　#ifdef&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_WIN64&nbsp;&nbsp;<br />　　typedef&nbsp;&nbsp;&nbsp;unsigned&nbsp;&nbsp;&nbsp;__int64&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">8个字节，64位&nbsp;</span><span style="color: #008000; "><br /></span>　　<span style="color: #0000FF; ">#else</span>&nbsp;&nbsp;<br />　　typedef&nbsp;&nbsp;&nbsp;_W64&nbsp;&nbsp;&nbsp;unsigned&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">4个字节，32位&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>　　<span style="color: #0000FF; ">#endif</span>&nbsp;&nbsp;<br />　　<span style="color: #0000FF; ">#define</span>&nbsp;&nbsp;&nbsp;_SIZE_T_DEFINED<br /><span style="color: #0000FF; ">#endif</span><br />&nbsp;<br /><br />&#9670;转换用到的最根本的&nbsp;API&nbsp;函数：<br />WideCharToMultiByte&nbsp;实现宽字节转换到窄字节　　　　　　　　　　<span style="color: #008000; ">//</span><span style="color: #008000; ">函数参数自行查询MSDN。</span><span style="color: #008000; "><br /></span>MultiByteToWideChar&nbsp;实现窄字节转换到宽字节　　　　　　　　　　<br /><br />WideCharToMultiByte&nbsp;的代码页用来标记与新转换的字符串相关的代码页；<br />MultiByteToWideChar&nbsp;的代码页用来标记与一个多字节字符串相关的代码页，<br /><br />[1]、常用的代码页有&nbsp;CP_ACP&nbsp;和&nbsp;CP_UTF8&nbsp;两个：&nbsp;使用&nbsp;CP_ACP&nbsp;代码页就实现了&nbsp;ANSI&nbsp;与&nbsp;Unicode&nbsp;之间的转换；<br />　　&nbsp;&nbsp;使用&nbsp;CP_UTF8&nbsp;代码页就实现了&nbsp;UTF-8&nbsp;与&nbsp;Unicode&nbsp;之间的转换。<br />[2]、dwFlags&nbsp;参数允许我们进行额外的控制，但是，一般情况下都不使用这个标志，直接传递&nbsp;0&nbsp;就行了。<br />[3]、lpDefaultChar和pfUsedDefaultChar：<br />只有当WideCharToMultiByte函数遇到一个宽字节字符，而该字符在uCodePage参数标识的代码页中并没有它的表示法时，WideCharToMultiByte函数才使用这两个参数。如果宽字节字符不能被转换，该函数便使用lpDefaultChar参数指向的字符。如果该参数是NULL（这是大多数情况下的参数值），那么该函数使用系统的默认字符。该默认字符通常是个问号。这对于文件名来说是危险的，因为问号是个通配符。pfUsedDefaultChar参数指向一个布尔变量，如果Unicode字符串中至少有一个字符不能转换成等价多字节字符，那么函数就将该变量置为TRUE。如果所有字符均被成功地转换，那么该函数就将该变量置为FALSE。当函数返回以便检查宽字节字符串是否被成功地转换后，可以测试该变量。<br /><br />&#9679;&nbsp;两个转换函数的使用举例：<br /><span style="color: #0000FF; ">char</span>&nbsp;*cctryWideCharToAnsi(wchar_t&nbsp;*pWideChar)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!pWideChar)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*pszBuf&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;needBytes&nbsp;=&nbsp;WideCharToMultiByte(CP_ACP,&nbsp;0,&nbsp;pWideChar,&nbsp;-1,&nbsp;NULL,&nbsp;0,&nbsp;NULL,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(needBytes&nbsp;&gt;&nbsp;0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pszBuf&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;<span style="color: #0000FF; ">char</span>[needBytes+1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(pszBuf,&nbsp;(needBytes+1)*<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">char</span>));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WideCharToMultiByte(CP_ACP,&nbsp;0,&nbsp;pWideChar,&nbsp;-1,&nbsp;pszBuf,&nbsp;needBytes,&nbsp;NULL,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;pszBuf;<br />}<br />&nbsp;<br />wchar_t&nbsp;*cctryAnsiCharToWide(<span style="color: #0000FF; ">char</span>&nbsp;*pChar)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!pChar)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;wchar_t&nbsp;*pszBuf&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;needWChar&nbsp;=&nbsp;MultiByteToWideChar(CP_ACP,&nbsp;0,&nbsp;pChar,&nbsp;-1,&nbsp;NULL,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(needWChar&nbsp;&gt;&nbsp;0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pszBuf&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;wchar_t[needWChar+1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(pszBuf,&nbsp;needWChar+1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MultiByteToWideChar(CP_ACP,&nbsp;0,&nbsp;pChar,&nbsp;-1,&nbsp;pszBuf,&nbsp;needWChar);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;pszBuf;<br />}<br />使用过后千万别忘记释放空间</div><img src ="http://www.cppblog.com/aaxron/aggbug/212479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2015-12-14 20:33 <a href="http://www.cppblog.com/aaxron/archive/2015/12/14/212479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何：将 System::String 转换为标准字符串</title><link>http://www.cppblog.com/aaxron/archive/2015/12/14/212478.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 14 Dec 2015 07:46:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2015/12/14/212478.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/212478.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2015/12/14/212478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/212478.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/212478.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">《精通.NET互操作：P/Invoke、C++&nbsp;Interop和COM&nbsp;Interop》<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">ms-help:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_vccore/html/79e2537e-d4eb-459f-9506-0e738045b59e.htm<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;convert_system_string.cpp<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;compile&nbsp;with:&nbsp;/clr</span><span style="color: #008000; "><br /></span>#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>&gt;<br />#include&nbsp;&lt;iostream&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;System;<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;MarshalString&nbsp;(&nbsp;String&nbsp;^&nbsp;s,&nbsp;<span style="color: #0000FF; ">string</span>&amp;&nbsp;os&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;Runtime::InteropServices;<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;chars&nbsp;=&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();<br />&nbsp;&nbsp;&nbsp;os&nbsp;=&nbsp;chars;<br />&nbsp;&nbsp;&nbsp;Marshal::FreeHGlobal(IntPtr((<span style="color: #0000FF; ">void</span>*)chars));<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;MarshalString&nbsp;(&nbsp;String&nbsp;^&nbsp;s,&nbsp;wstring&amp;&nbsp;os&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;Runtime::InteropServices;<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;wchar_t*&nbsp;chars&nbsp;=&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">const</span>&nbsp;wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer();<br />&nbsp;&nbsp;&nbsp;os&nbsp;=&nbsp;chars;<br />&nbsp;&nbsp;&nbsp;Marshal::FreeHGlobal(IntPtr((<span style="color: #0000FF; ">void</span>*)chars));<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;a&nbsp;=&nbsp;"test";<br />&nbsp;&nbsp;&nbsp;wstring&nbsp;b&nbsp;=&nbsp;L"test2";<br />&nbsp;&nbsp;&nbsp;String&nbsp;^&nbsp;c&nbsp;=&nbsp;gcnew&nbsp;String("abcd");<br /><br />&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;a&nbsp;&lt;&lt;&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;MarshalString(c,&nbsp;a);<br />&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;"efgh";<br />&nbsp;&nbsp;&nbsp;MarshalString(c,&nbsp;b);<br />&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;a&nbsp;&lt;&lt;&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;wcout&nbsp;&lt;&lt;&nbsp;b&nbsp;&lt;&lt;&nbsp;endl;<br />}</div><img src ="http://www.cppblog.com/aaxron/aggbug/212478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2015-12-14 15:46 <a href="http://www.cppblog.com/aaxron/archive/2015/12/14/212478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>autoexp.dat  Writing custom visualizers for Visual Studio</title><link>http://www.cppblog.com/aaxron/archive/2015/12/09/212442.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 09 Dec 2015 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2015/12/09/212442.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/212442.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2015/12/09/212442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/212442.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/212442.html</trackback:ping><description><![CDATA[<div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">libWL.h</span><span style="color: #008000; "><br /></span>#pragma&nbsp;once<br />#ifdef&nbsp;LIBWL_EXPORTS<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;LIBWL_API&nbsp;__declspec(dllexport)<br /><span style="color: #0000FF; ">#else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;LIBWL_API&nbsp;__declspec(dllimport)<br /><span style="color: #0000FF; ">#endif</span><br /><br /><span style="color: #0000FF; ">namespace</span>&nbsp;Text&nbsp;{<br /><span style="color: #0000FF; ">class</span>&nbsp;LIBWL_API&nbsp;StringA<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;StringAImpl;<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;StringA();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~StringA();<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Format();<br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;size;<br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;StringAImpl*&nbsp;impl;<br />};<br />}</div><br /><div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">libWL.cpp</span><span style="color: #008000; "><br /></span>#include&nbsp;"stdafx.h"<br />#include&nbsp;"libWL.h"<br /><br /><span style="color: #0000FF; ">using</span>&nbsp;Text::StringA;<br /><span style="color: #0000FF; ">struct</span>&nbsp;StringA::StringAImpl{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;data;<br />};<br />StringA::StringA():impl(<span style="color: #0000FF; ">new</span>&nbsp;StringAImpl()),data(NULL),size(0)<br />{<br />}<br />StringA::~StringA()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;impl;<br />}<br /><span style="color: #0000FF; ">void</span>&nbsp;StringA::Format()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;buf[]&nbsp;=&nbsp;"abc1234";<br />&nbsp;&nbsp;&nbsp;&nbsp;impl-&gt;data.resize(23);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>-&gt;data&nbsp;=&nbsp;&amp;impl-&gt;data[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;strcpy(data,buf);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>-&gt;size&nbsp;=&nbsp;impl-&gt;data.size();<br />}</div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">;</span><span style="color: #008000; ">autoexp.dat</span><span style="color: #008000; "><br /></span><span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">Visualizer</span><span style="color: #800000; font-weight: bold; ">]</span><br />Text::StringA{<br />&nbsp;&nbsp;&nbsp;&nbsp;preview&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">$e.data,s</span><span style="color: #800000; font-weight: bold; ">]</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;stringview&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">$e.data,sb</span><span style="color: #800000; font-weight: bold; ">]</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;children<br />&nbsp;&nbsp;&nbsp;&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">data</span><span style="color: #800000; font-weight: bold; ">]</span>:$e.data,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">size</span><span style="color: #800000; font-weight: bold; ">]</span>:$e.size,<br />&nbsp;&nbsp;&nbsp;&nbsp;#array(&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expr:&nbsp;$e.data<span style="color: #800000; font-weight: bold; ">[</span><span style="color: #800000; ">$i</span><span style="color: #800000; font-weight: bold; ">]</span>,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size:&nbsp;$e.size<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;)<br />}</div><br /><br />参见:<br /><div>http://blog.csdn.net/pizi0475/article/details/5833102</div><img src ="http://www.cppblog.com/aaxron/aggbug/212442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2015-12-09 16:45 <a href="http://www.cppblog.com/aaxron/archive/2015/12/09/212442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：c/c++ 前置声明 -- typedef问题</title><link>http://www.cppblog.com/aaxron/archive/2015/10/29/212147.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 29 Oct 2015 08:14:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2015/10/29/212147.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/212147.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2015/10/29/212147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/212147.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/212147.html</trackback:ping><description><![CDATA[转：<span style="font-size: 13px; background-color: #eeeeee;">c/</span><span style="font-size: 13px; background-color: #eeeeee;">c</span><span style="font-size: 13px; background-color: #eeeeee;">++</span><span style="font-size: 13px; background-color: #eeeeee;">&nbsp;前置声明&nbsp;</span><span style="font-size: 13px; background-color: #eeeeee;">--</span><span style="font-size: 13px; background-color: #eeeeee;">&nbsp;typedef问题</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->c/c++&nbsp;前置声明&nbsp;--&nbsp;typedef问题<br />cc++类结构体typedef前置声明<br />前置声明的好处很多,&nbsp;比如能避免头文件互相包含的冲突,&nbsp;比如有时我们在一个头文件中只需要另一个头文件的某个类型定义,&nbsp;只需要对它做一下前置声明即可,<br /><br />因为为了相对较小的目的要包含进来一个很大的头文件,&nbsp;实在有些"不值",&nbsp;况且这个头文件可能还要被其它很多文件再包含的,&nbsp;这样代价就更大了.<br /><br />所以做前置声明即可,&nbsp;在源文件真正需要的时候再包含那个头文件.<br /><br /><br />之前也声明过类和c++方式定义的struct,&nbsp;今天遇到了一个typedef的结构体,&nbsp;结果前置声明不奏效了.<br /><br /><br />网上查了些资料,&nbsp;有的帖子没有讨论出结果,&nbsp;有的直接定性typedef的不能前置声明,&nbsp;只能include进来.<br /><br />幸好自己写小例子多测试了一会,&nbsp;发现语法上还是支持的.&nbsp;举例如下:<br /><br />#a.h:<br />typedef&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;my_time_t&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;hour,&nbsp;minute,&nbsp;second;&nbsp;&nbsp;<br />}&nbsp;MY_TIME;&nbsp;&nbsp;<br /><br />#b.h<br /><span style="color: #0000FF; ">struct</span>&nbsp;my_time_t;&nbsp;&nbsp;<br />typedef&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;my_time_t&nbsp;MY_TIME;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br /><span style="color: #0000FF; ">void</span>&nbsp;func(MY_TIME*&nbsp;mt)&nbsp;{}&nbsp;&nbsp;<br /><br />#main.cpp<br />#include&nbsp;"a.h"&nbsp;&nbsp;<br />#include&nbsp;"b.h"&nbsp;&nbsp;<br />&nbsp;&nbsp;<br /><span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;MY_TIME&nbsp;mt;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;func(&amp;mt);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;&nbsp;&nbsp;<br />}&nbsp;&nbsp;<br /><br />这样就可以成功了.&nbsp;在b.h中做前置声明时,&nbsp;先声明有my_time_t这样一个struct,&nbsp;然后说明MY_TIME是由那个结构体typedef出来的,&nbsp;<br /><br />这样void&nbsp;func(MY_TIME*&nbsp;mt);这个函数声明就能编译通过了.&nbsp;&nbsp;&nbsp;直接做struct&nbsp;MY_TIME;这样的前置声明是不被接受的.</div><img src ="http://www.cppblog.com/aaxron/aggbug/212147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2015-10-29 16:14 <a href="http://www.cppblog.com/aaxron/archive/2015/10/29/212147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tr</title><link>http://www.cppblog.com/aaxron/archive/2015/10/10/211985.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Sat, 10 Oct 2015 09:10:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2015/10/10/211985.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/211985.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2015/10/10/211985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/211985.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/211985.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">#ifdef</span>&nbsp;<span style="color: #993300;">_UNICODE</span><br /><span style="color: #0000ff;">CString</span>&nbsp;trW(LPCTSTR&nbsp;format,<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;va_list&nbsp;arg;<br />&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;text;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(format==NULL&nbsp;||&nbsp;format[0]==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;text;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;va_start(arg,&nbsp;format);<br />&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;_vsnwprintf(NULL,0,format,arg);<br />&nbsp;&nbsp;&nbsp;&nbsp;va_end(arg);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;_ASSERT(len&gt;=0);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;va_start(arg,&nbsp;format);<br />&nbsp;&nbsp;&nbsp;&nbsp;vswprintf(text.GetBuffer(len+1),format,arg);<br />&nbsp;&nbsp;&nbsp;&nbsp;text.ReleaseBuffer();<br />&nbsp;&nbsp;&nbsp;&nbsp;va_end(arg);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;text;<br />}<br /><span style="color: #0000FF; ">#else</span><br /><span style="color: #0000ff;">CString</span>&nbsp;trA(LPCTSTR&nbsp;format,<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;va_list&nbsp;arg;<br />&nbsp;&nbsp;&nbsp;&nbsp;CString&nbsp;text;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(format==NULL&nbsp;||&nbsp;format[0]==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;text;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;va_start(arg,&nbsp;format);<br />&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;_vsnprintf(NULL,0,format,arg);<br />&nbsp;&nbsp;&nbsp;&nbsp;va_end(arg);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;_ASSERT(len&gt;=0);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;va_start(arg,&nbsp;format);<br />&nbsp;&nbsp;&nbsp;&nbsp;vsprintf(text.GetBuffer(len+1),format,arg);<br />&nbsp;&nbsp;&nbsp;&nbsp;text.ReleaseBuffer();<br />&nbsp;&nbsp;&nbsp;&nbsp;va_end(arg);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;text;<br />}<br /><span style="color: #0000FF; ">#endif</span><br /><br /><span style="color: #0000ff;">#ifdef</span>&nbsp;<span style="color: #993300;">_UNICODE</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;tr&nbsp;trW<br /><span style="color: #0000FF; ">#else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;tr&nbsp;trA<br /><span style="color: #0000FF; ">#endif</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/211985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2015-10-10 17:10 <a href="http://www.cppblog.com/aaxron/archive/2015/10/10/211985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>杂记Json,MySQL,C#</title><link>http://www.cppblog.com/aaxron/archive/2015/07/06/211165.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 06 Jul 2015 11:37:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2015/07/06/211165.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/211165.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2015/07/06/211165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/211165.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/211165.html</trackback:ping><description><![CDATA[<div><div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->MySQL&nbsp;1045权限错误&nbsp;的解决:<br />GRANT&nbsp;ALL&nbsp;PRIVILEGES&nbsp;ON&nbsp;*.*&nbsp;TO&nbsp;test_user@'%'&nbsp;IDENTIFIED&nbsp;BY&nbsp;'123456'&nbsp;WITH&nbsp;GRANT&nbsp;OPTION;<br /><br /><br />libJson(Jsoncpp),够用了.<br />C++:<br /><span style="color: #0000FF; ">extern</span>&nbsp;"C"&nbsp;LIB_MESCLIENT_API&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nw_save_prodmade_data(<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*&nbsp;jo_in);<br /><br />Json::Value&nbsp;jo;<br />jo["row"]["product_id"]&nbsp;=&nbsp;"21265";&nbsp;<br />jo["row"]["product_sn"]&nbsp;=&nbsp;223456789012345678;&nbsp;<br /><span style="color: #0000FF; ">int</span>&nbsp;error_code&nbsp;=&nbsp;nw_save_prodmade_data(jo.toStyledString().c_str());<br /><br /><br />C#下用Newtonsoft.Json也挺好用的<br /><span style="color: #0000FF; ">using</span>&nbsp;Newtonsoft.Json.Linq;<br />JObject&nbsp;jo&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JObject();<br />jo["row"]&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JObject();<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">此部分在dll内部会插入到可追溯状态表&nbsp;nw_sn_status</span><span style="color: #008000; "><br /></span>jo["row"]["product_id"]&nbsp;=&nbsp;"12\r\n3\"12'\"65";&nbsp;//产品ID<br />StringBuilder&nbsp;row&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;StringBuilder(jo.ToString());<br /><span style="color: #0000FF; ">int</span>&nbsp;error_code&nbsp;=&nbsp;nw_save_prodmade_data(row);</div></div><br /><br /></div></div><img src ="http://www.cppblog.com/aaxron/aggbug/211165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2015-07-06 19:37 <a href="http://www.cppblog.com/aaxron/archive/2015/07/06/211165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MapStream</title><link>http://www.cppblog.com/aaxron/archive/2014/04/07/206493.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 07 Apr 2014 05:52:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2014/04/07/206493.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/206493.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2014/04/07/206493.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/206493.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/206493.html</trackback:ping><description><![CDATA[<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#pragma&nbsp;once<br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">map</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">cstdio</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><br />#ifdef&nbsp;_WIN32<br />&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">stat.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#else</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /><br />template</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;Key,typename&nbsp;Value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MapStream<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;std::map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Key,Value</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;m_mapTable;<br />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;typename&nbsp;std::map</span><span style="color: #000000">&lt;</span><span style="color: #000000">Key,Value</span><span style="color: #000000">&gt;</span><span style="color: #000000">::iterator&nbsp;MapStreamIterator;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GetFileSize(</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;filename)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;stat&nbsp;f_stat;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(stat(filename,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">f_stat)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;f_stat.st_size;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;Load(</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;filename)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;fp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;fopen(filename,</span><span style="color: #000000">"</span><span style="color: #000000">rb</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(fp&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;metasize&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(Key)&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(Value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;buffer[</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(Key)&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(Value)];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;readed;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;_key;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Value</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;_value;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_mapTable.clear();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(fread(buffer,</span><span style="color: #000000">1</span><span style="color: #000000">,metasize,fp)</span><span style="color: #000000">==</span><span style="color: #000000">metasize)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_key&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Key</span><span style="color: #000000">*</span><span style="color: #000000">)buffer;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_value&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Value</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">buffer[</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(Key)];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_mapTable[</span><span style="color: #000000">*</span><span style="color: #000000">_key]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">_value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(GetFileSize(filename)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;(m_mapTable.size()</span><span style="color: #000000">*</span><span style="color: #000000">metasize));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;Save(</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;filename)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;fp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;fopen(filename,</span><span style="color: #000000">"</span><span style="color: #000000">wb</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(fp&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;metasize&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(Key)&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(Value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;buffer[</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(Key)&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(Value)];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;readed;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;_key;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Value</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;_value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MapStreamIterator&nbsp;iter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m_mapTable.begin();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(iter</span><span style="color: #000000">!=</span><span style="color: #000000">m_mapTable.end())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite(</span><span style="color: #000000">&amp;</span><span style="color: #000000">iter</span><span style="color: #000000">-&gt;</span><span style="color: #000000">first,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(Key),fp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite(</span><span style="color: #000000">&amp;</span><span style="color: #000000">iter</span><span style="color: #000000">-&gt;</span><span style="color: #000000">second,</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(Value),fp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;filesize&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetFileSize(filename);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(GetFileSize(filename)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;(m_mapTable.size()</span><span style="color: #000000">*</span><span style="color: #000000">metasize));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Value</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">operator</span><span style="color: #000000">[]&nbsp;(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;Key</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;_key)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;m_mapTable[_key];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Value</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;GetValue(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;Key</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;_key)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MapStreamIterator&nbsp;iter&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m_mapTable.find(_key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(iter</span><span style="color: #000000">!=</span><span style="color: #000000">m_mapTable.end())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">iter</span><span style="color: #000000">-&gt;</span><span style="color: #000000">second;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;SetValue(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;Key</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;_key,</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;Value</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;_value)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_mapTable[_key]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_value;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;RemoveKey(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;Key</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;_key)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_mapTable.erase(_key);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Count()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;m_mapTable.size();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/206493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2014-04-07 13:52 <a href="http://www.cppblog.com/aaxron/archive/2014/04/07/206493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++类中模板函数的特化</title><link>http://www.cppblog.com/aaxron/archive/2013/06/26/201317.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 26 Jun 2013 03:51:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/06/26/201317.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/201317.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/06/26/201317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/201317.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/201317.html</trackback:ping><description><![CDATA[<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">C</span><span style="color: #000000">++</span><span style="color: #000000">类中模板函数的特化<br /><br /></span><span style="color: #000000">最近在使用在使用模板特化&nbsp;写一段程序时发现一个奇怪的问题，比如像如下代码：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CMyClass<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;test<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;test</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">long</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />};<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMyClass::test</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;test1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMyClass::test</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">long</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;test2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMyClass::test</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">char</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;test3;<br /><br />&nbsp;&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">typeid(test1.i)&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;typeid(test1.i).name()&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br />&nbsp;&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">typeid(test2.i)&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;typeid(test2.i).name()&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br />&nbsp;&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">typeid(test3.i)&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;typeid(test3.i).name()&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br /><br />&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 />}<br /><br />这段代码在Linux下的GCC&nbsp;</span><span style="color: #000000">3.4</span><span style="color: #000000">.3下无法编译通过，编译时提示错误：<br /><br />xxx.cpp:</span><span style="color: #000000">12</span><span style="color: #000000">:&nbsp;error:&nbsp;invalid&nbsp;</span><span style="color: #0000ff">explicit</span><span style="color: #000000">&nbsp;specialization&nbsp;before&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">&gt;</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;token<br />xxx.cpp:</span><span style="color: #000000">12</span><span style="color: #000000">:&nbsp;error:&nbsp;</span><span style="color: #0000ff">explicit</span><span style="color: #000000">&nbsp;specialization&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;non</span><span style="color: #000000">-</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;scope&nbsp;`</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CMyClass</span><span style="color: #000000">'<br /></span><span style="color: #000000"><br />但在VC6和VC8下都可以编译通过。<br /><br />&nbsp;<br /><br />后翻阅资料，发现有人提到，C</span><span style="color: #000000">++</span><span style="color: #000000">标准中规定，嵌套类模板在类的定义中不允许被显示特化声明，只允许偏特化（&#8220;Explicit&nbsp;template&nbsp;specialization&nbsp;</span><span style="color: #0000ff">is</span><span style="color: #000000">&nbsp;forbidden&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;nested&nbsp;classes&nbsp;&#8221;，&#8220;As&nbsp;partial&nbsp;template&nbsp;specialization&nbsp;</span><span style="color: #0000ff">is</span><span style="color: #000000">&nbsp;not&nbsp;forbidden&nbsp;&#8221;），比如，这样就可以：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CMyClass<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;T,&nbsp;typename&nbsp;S&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;test<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;S</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;test</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">long</span><span style="color: #000000">,&nbsp;S</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />};<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMyClass::test</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;test1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMyClass::test</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">long</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;test2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMyClass::test</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">char</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;test3;<br /><br />&nbsp;&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">typeid(test1.i)&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;typeid(test1.i).name()&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br />&nbsp;&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">typeid(test2.i)&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;typeid(test2.i).name()&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br />&nbsp;&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">typeid(test3.i)&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;typeid(test3.i).name()&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br /><br />&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 /><br />}<br /><br />在上面这段代码使用一个无用的模板参数来实现以偏特代替特化，从而化解了这个问题。至于为什么VC下能够正常编译，网上的资料说是VC不符合标准&nbsp;（&#8220;MSVC&nbsp;</span><span style="color: #0000ff">is</span><span style="color: #000000">&nbsp;wrong&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;and&nbsp;g</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;correct&#8221;），不过这点我尚未在C</span><span style="color: #000000">++</span><span style="color: #000000">标准中找到明文依据。<br /><br />但是这样一来就有个问题，偏特化在VC6下是用BUG的，无法正常使用，也就是说出来的代码将无法兼容VC6。对于VC6这样落伍的编译器，兼容它&nbsp;是没有太大的必要，但是回头想想，难道要在定义嵌套类模板的特化，就不行了么？必须使用偏特化来代替么？C</span><span style="color: #000000">++</span><span style="color: #000000">对此是如何规定的呢？翻阅相关资料后，我找&nbsp;到了答案－－要把特化的代码写在类定义的外面（要写在namespace下），如第一段代码应该写成这样：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CMyClass<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;test<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />};<br />template&nbsp;</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;CMyClass::test</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">long</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;i;<br />};<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">void</span><span style="color: #000000">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMyClass::test</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;test1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMyClass::test</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">long</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;test2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMyClass::test</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">char</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;test3;<br /><br />&nbsp;&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">typeid(test1.i)&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;typeid(test1.i).name()&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br />&nbsp;&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">typeid(test2.i)&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;typeid(test2.i).name()&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br />&nbsp;&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">typeid(test3.i)&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;typeid(test3.i).name()&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br /><br />&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 />}<br /><br />这样修改后，就可以在GCC下编译通过了，同时，VC6，VC8也都能编译通过！<br /><br />总结一下吧：<br />在C</span><span style="color: #000000">++</span><span style="color: #000000">中，如果要对嵌套类模板进行特化，则要么使用偏特化来替代特化（增加一个无用的模板参数），要么将&nbsp;特化代码放在类定义之外。<br /><br />同样的,非模板函数具有最高的优先权<br /></span></div><br /><br /><br /><br />转自:<a href="http://jeffreyloo.blog.163.com/blog/static/12176167020106171424608/">http://jeffreyloo.blog.163.com/blog/static/12176167020106171424608/</a> <img src ="http://www.cppblog.com/aaxron/aggbug/201317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-06-26 11:51 <a href="http://www.cppblog.com/aaxron/archive/2013/06/26/201317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>模板特化和偏特化</title><link>http://www.cppblog.com/aaxron/archive/2013/06/26/201316.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 26 Jun 2013 03:38:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/06/26/201316.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/201316.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/06/26/201316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/201316.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/201316.html</trackback:ping><description><![CDATA[<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">模板特化和偏特化<br />C</span><span style="color: #000000">++</span><span style="color: #000000">中的模板分为类模板和函数模板<br /><br />&#183;模板的特化<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />(</span><span style="color: #000000">1</span><span style="color: #000000">)类模板特化<br />有时为了需要,针对特定的类型,需要对模板进行特化,也就是特殊处理.例如,stack类模板针对bool类型,因为实际上bool类型只需要一个二进制位，就可以对其进行存储,使用一个字或者一个字节都是浪费存储空间的.<br />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;stack&nbsp;{};<br /><br />template</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;stack</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&#8230;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">};<br /><br />上述定义中template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">告诉编译器这是一个特化的模板。并且在声明特化模板之前一定要有非特化的声明！并且两个类的名字是一样的！<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />(</span><span style="color: #000000">2</span><span style="color: #000000">)函数模板的特化<br />看下面的例子<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;highest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mymax(</span><span style="color: #000000">5</span><span style="color: #000000">,</span><span style="color: #000000">10</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mymax(&#8216;a&#8217;,&nbsp;&#8217;z&#8217;);<br />&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;p1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&#8220;hello&#8221;;<br />&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;p2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&#8220;world&#8221;;<br />&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;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mymax(p1,p2);<br />&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 />}<br />前面两个mymax都能返回正确的结果.而第三个却不能,因为,此时mymax直接比较两个指针p1&nbsp;和&nbsp;p2&nbsp;而不是其指向的内容.<br />针对这种情况,当mymax函数的参数类型为const&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;时,需要特化。<br />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />T&nbsp;mymax(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T&nbsp;t1,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T&nbsp;t2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;t1&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;t2&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;t2&nbsp;:&nbsp;t1;<br />}<br />template&nbsp;</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000"><br /></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;mymax(</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;t1,</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;t2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(strcmp(t1,t2)&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;t2&nbsp;:&nbsp;t1;<br />}<br />现在mymax(p1,p2)能够返回正确的结果了。<br /><br /></span><span style="color: #000000">4</span><span style="color: #000000">.模板的偏特化<br />模板的偏特化是指需要根据模板的某些但不是全部的参数进行特化<br />(</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;类模板的偏特化<br />例如c</span><span style="color: #000000">++</span><span style="color: #000000">标准库中的类vector的定义<br />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T,&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Allocator</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;vector&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&#8230;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">};<br /><br />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Allocator</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">bool</span><span style="color: #000000">,&nbsp;Allocator</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&#8230;</span><span style="color: #008000">//<br /></span><span style="color: #000000">};<br />这个偏特化的例子中，一个参数被绑定到bool类型，而另一个参数仍未绑定需要由用户指定。<br /><br />(</span><span style="color: #000000">2</span><span style="color: #000000">)&nbsp;函数模板的偏特化<br />严格的来说，函数模板并不支持偏特化，但由于可以对函数进行重载，所以可以达到类似于类模板偏特化的效果。<br />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f(T);&nbsp;&nbsp;&nbsp;(a)<br />根据重载规则，对（a）进行重载<br />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f(T</span><span style="color: #000000">*</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;(b)<br />如果将（a）称为基模板，那么（b）称为对基模板（a）的重载，而非对（a）的偏特化。C</span><span style="color: #000000">++</span><span style="color: #000000">的标准委员会仍在对下一个版本中是否允许函数模板的偏特化进行讨论。<br /></span><span style="color: #000000">5</span><span style="color: #000000">.模板特化时的匹配规则<br />(</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;类模板的匹配规则<br />最优化的优于次特化的，即模板参数最精确匹配的具有最高的优先权<br />例子：<br />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;vector<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&#8230;</span><span style="color: #008000">//<br /></span><span style="color: #000000">};&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;(a)&nbsp;&nbsp;&nbsp;普通型</span><span style="color: #008000"><br /></span><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">*&gt;</span><span style="color: #000000"><br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&#8230;</span><span style="color: #008000">//<br /></span><span style="color: #000000">};&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;(b)&nbsp;对指针类型特化</span><span style="color: #008000"><br /></span><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;vector&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">void</span><span style="color: #000000">*&gt;</span><span style="color: #000000"><br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&#8230;</span><span style="color: #008000">//<br /></span><span style="color: #000000">};&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;(c)&nbsp;对void*进行特化</span><span style="color: #008000"><br /></span><span style="color: #000000">每个类型都可以用作普通型（a）的参数，但只有指针类型才能用作（b）的参数，而只有void</span><span style="color: #000000">*</span><span style="color: #000000">才能作为(c)的参数<br /><br />(</span><span style="color: #000000">2</span><span style="color: #000000">)&nbsp;函数模板的匹配规则<br />非模板函数具有最高的优先权。如果不存在匹配的非模板函数的话，那么最匹配的和最特化的函数具有高优先权<br />例子：<br />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f(T);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;(d)</span><span style="color: #008000"><br /></span><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f(</span><span style="color: #0000ff">int</span><span style="color: #000000">,&nbsp;T,&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;(e)</span><span style="color: #008000"><br /></span><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f(T</span><span style="color: #000000">*</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;(f)</span><span style="color: #008000"><br /></span><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">)&nbsp;;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;(g)</span><span style="color: #008000"><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;f(</span><span style="color: #0000ff">double</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;(h)</span><span style="color: #008000"><br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;b;<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i;<br /></span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;d;<br />f(b);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;以&nbsp;T&nbsp;=&nbsp;bool&nbsp;调用&nbsp;（d）</span><span style="color: #008000"><br /></span><span style="color: #000000">f(i,</span><span style="color: #000000">42</span><span style="color: #000000">,d)&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;以&nbsp;T&nbsp;=&nbsp;int&nbsp;调用（e）</span><span style="color: #008000"><br /></span><span style="color: #000000">f(</span><span style="color: #000000">&amp;</span><span style="color: #000000">i)&nbsp;;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;以&nbsp;T&nbsp;=&nbsp;int*&nbsp;调用（f）</span><span style="color: #008000"><br /></span><span style="color: #000000">f(d);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;调用（h）</span></div> <img src ="http://www.cppblog.com/aaxron/aggbug/201316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-06-26 11:38 <a href="http://www.cppblog.com/aaxron/archive/2013/06/26/201316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ 高级主题之模板特化</title><link>http://www.cppblog.com/aaxron/archive/2013/06/26/201314.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Wed, 26 Jun 2013 03:36:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/06/26/201314.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/201314.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/06/26/201314.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/201314.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/201314.html</trackback:ping><description><![CDATA[<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">C</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;高级主题之模板特化<br />我们很难写出所有可能被实例化的类型都合适的模板。某些情况下，通用模板定义对于某个类型可能是完全错误的，所以我们需要能够实现处理某些特殊情况，特化的概念变是如此。<br />compare函数和Queue类是这个问题的很好例子。因为与C风格字符串一起使用时，他们都不能正确工作。<br />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;compare(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">v1,</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">v2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(v1&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;v2)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(v2&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;v1)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&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 />}<br />如果用两个const&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;实参调用这个模板定义，函数将比较指针的值。也就是比较两个指针在内存中的相对位置，却并没有说明与指针所指数组的内容有关的任何事情。<br />为了能够将compare函数用于字符串，必须提供一个知道怎样比较C风格字符串的特殊定义。这些就被称作是特化的，它对模板的用户而言是透明的。<br /><br /></span><span style="color: #000000">1</span><span style="color: #000000">.&nbsp;函数模板的特化<br />特化形式：<br /></span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;关键字template后面接一对空的尖括号</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">;<br /></span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;再接模板名和一对尖括号</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">，尖括号中指定这个特化定义的模板参数：<br /></span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;函数形参表<br /></span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;函数体<br />template</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;compare</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*&gt;</span><span style="color: #000000">&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;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">v1,</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;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">v2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;strcmp(v1,v2);<br />}<br />特化的声明必须与&nbsp;对应的模板相匹配。类型形参固定为const&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">。<br />因此，函数形参是const&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;的const引用。当调用compare函数的时候，<br />传给它两个字符指针，编译器将调用特化版本。而不调用上面的泛型版本。<br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">cp1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">world</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">cp2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">hi</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i1,&nbsp;i2;<br />compare(cp1,&nbsp;cp2);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">调用特化函数模板</span><span style="color: #008000"><br /></span><span style="color: #000000">compare(i1,&nbsp;i2);&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">调用泛型函数模板</span><span style="color: #008000"><br /></span><span style="color: #000000">注意：<br /></span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;函数模板特化时template</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">不能省略，如果缺少结果是声明该函数的重载。<br /></span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;必须包含函数形参列表。如果可以从形参列表推断模板实参，则不必显示指定模板实参。<br /></span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;如果程序由多个文件构成，模板特化的声明必须在使用该特化的每个文件中出现。<br /><br /></span><span style="color: #000000">2</span><span style="color: #000000">.类模板的特化<br />当使用C风格字符串时，Queue类具有&nbsp;compare函数相似的问题。问题就处在push函数中，该函数复制给定的值以创建Queue中的新元素。默认情况下，复制C风格字符串只会复制指针，不会复制字符。而显然复制指针将出现一系列的严重问题。为了解决复制C风格字符串的问题，需要为const&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">定义整个类的特化版本:<br />template</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000">&nbsp;<br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Queue</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*&gt;</span><span style="color: #000000">&nbsp;<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;push(</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">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;pop()&nbsp;{real_queue.pop();}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;empty()&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;{</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;real_queue.front();}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回类型与模板参数类型不同</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;front()&nbsp;{</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;real_queue.front();}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">front()&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;{</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;real_queue.front();}<br /></span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;:<br />&nbsp;&nbsp;&nbsp;&nbsp;Queue</span><span style="color: #000000">&lt;</span><span style="color: #000000">std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;real_queue;<br />};<br /><br />给Queue一个新的数据元素,string对象的Queue。在类的外部定义一个成员:<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Queue</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*&gt;</span><span style="color: #000000">::push&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;val)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;real_queue.push(val);<br />}<br />这个函数通过调用read_queue的push函数把val指向的数组复制到未命名的string&nbsp;对象中。当需要出队列的时候调用相应real_queue.pop()函数即返回了这个string，从而解决了不用复制指针的问题。<br /><br /></span><span style="color: #000000">3</span><span style="color: #000000">.特化成员而不特化类在上例的实现中，我们可以换一种方法，即不需要特化类，而只需要特化类的成员函数push、pop。根据函数模板特化的要求：<br />template&nbsp;</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Queue</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*&gt;</span><span style="color: #000000">::push(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">val)<br />{<br />&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">&nbsp;new_item&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">[strlen(val)</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;strncpy(new_item,&nbsp;val,&nbsp;strlen(val)</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;QueueItem</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;QueueItem</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*&gt;</span><span style="color: #000000">(new_item);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(empty())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tail&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pt;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">队列中没有元素</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;eles{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail</span><span style="color: #000000">-&gt;</span><span style="color: #000000">next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pt;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">添加新元素到列尾</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tail&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pt;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />template</span><span style="color: #000000">&lt;&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Queue</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*&gt;</span><span style="color: #000000">::pop()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;QueueItem</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">*&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;head;<br />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;head</span><span style="color: #000000">-&gt;</span><span style="color: #000000">item;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">删除队首元素</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;head&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;head</span><span style="color: #000000">-&gt;</span><span style="color: #000000">next;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">指向当前队首元素</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;p;&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 /></span><span style="color: #000000">}<br /><br /></span><span style="color: #000000">4</span><span style="color: #000000">.类模板的部分特化<br />&nbsp;&nbsp;&nbsp;&nbsp;如果类模板有一个以上的模板形参，我们很有可能只要特化某些模板形参<br />&nbsp;&nbsp;&nbsp;&nbsp;而不是全部形参。这时我们就需要使用类的部分特化。<br /></span><span style="color: #008000">//</span><span style="color: #008000">定义模板类</span><span style="color: #008000"><br /></span><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T1,&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T2</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;some_template{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /></span><span style="color: #000000">};<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">定义模板类的部分特化：T2类型固定，部分特化T1类型</span><span style="color: #008000"><br /></span><span style="color: #000000">template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T1</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;some_template</span><span style="color: #000000">&lt;</span><span style="color: #000000">T1,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /></span><span style="color: #000000">};<br /></span><span style="color: #008000">//</span><span style="color: #008000">使用类模板的部分特化</span><span style="color: #008000"><br /></span><span style="color: #000000">some_template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;foo;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">使用模板类</span><span style="color: #008000"><br /></span><span style="color: #000000">some_template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;bar;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">使用模板类的部分特化</span><span style="color: #008000"><br /></span><span style="color: #000000">通过使用模板特化能解决一些在通常或者通用情况下无法解决的特殊问题。在掌握了基本的语法规范和实现方法后便可以加以应用。</span></div> <img src ="http://www.cppblog.com/aaxron/aggbug/201314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-06-26 11:36 <a href="http://www.cppblog.com/aaxron/archive/2013/06/26/201314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++知识点:返回引用,前置声明,using</title><link>http://www.cppblog.com/aaxron/archive/2013/05/23/200552.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Thu, 23 May 2013 10:27:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/05/23/200552.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/200552.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/05/23/200552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/200552.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/200552.html</trackback:ping><description><![CDATA[<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">//</span><span style="color: #008000">1.h</span><span style="color: #008000"><br /></span><span style="color: #000000">#pragma&nbsp;once<br /></span><span style="color: #008000">//</span><span style="color: #008000">class&nbsp;std::string;&nbsp;含有命名空间的话,这样使用无效,</span><span style="color: #008000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;std::</span><span style="color: #0000ff">string</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">string</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;GetString(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n);&nbsp;<br /><br /></span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;std::map</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">,std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;strings;<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">1.cpp</span><span style="color: #008000"><br /></span><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 />std::map</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">,std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;strings;<br /><br /><br /></span><span style="color: #008000">/*</span><span style="color: #008000"><br />千万不要返回局部对象的引用。当函数执行完毕时，将释放分配给局部对象的存储空间。此时，对局部对象的引用就会指向不确定的内存。如：<br /><br />const&nbsp;string&nbsp;&amp;manip(const&nbsp;string&nbsp;&amp;s)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;ret&nbsp;=s;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;&nbsp;&nbsp;//wrong:returning&nbsp;reference&nbsp;to&nbsp;a&nbsp;local&nbsp;object<br />}<br />4，引用返回左值。返回引用的函数返回一个左值。因此这样的函数可用于任何要求使用左值的地方。<br />示例见：c++&nbsp;primer&nbsp;p215<br /><br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /></span><span style="color: #0000ff">string</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;GetString(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;std::map</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">,std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000">::iterator&nbsp;iter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;strings.find(n);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(iter</span><span style="color: #000000">==</span><span style="color: #000000">strings.end())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;strings[</span><span style="color: #000000">0</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;iter</span><span style="color: #000000">-&gt;</span><span style="color: #000000">second;<br />}<br /><br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">main.cpp</span><span style="color: #008000"><br /></span><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 /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;strings[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">_0</span><span style="color: #000000">"</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;strings[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">_1</span><span style="color: #000000">"</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;strings[</span><span style="color: #000000">2</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">_2</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetString(</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetString(</span><span style="color: #000000">1</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000">"</span><span style="color: #000000">pause</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&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 />}<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">stdafx.h<br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;stdafx.h&nbsp;:&nbsp;include&nbsp;file&nbsp;for&nbsp;standard&nbsp;system&nbsp;include&nbsp;files,<br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;or&nbsp;project&nbsp;specific&nbsp;include&nbsp;files&nbsp;that&nbsp;are&nbsp;used&nbsp;frequently,&nbsp;but<br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;are&nbsp;changed&nbsp;infrequently</span><span style="color: #008000"><br /></span><span style="color: #000000">#pragma&nbsp;once<br />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">targetver.h</span><span style="color: #000000">"</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#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 />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">tchar.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;_ATL_CSTRING_EXPLICIT_CONSTRUCTORS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;some&nbsp;CString&nbsp;constructors&nbsp;will&nbsp;be&nbsp;explicit</span><span style="color: #000000"><br /><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">atlbase.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">atlstr.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">strsafe.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#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 />#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 />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">vector</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">time.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#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 />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">assert.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">map</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">1.h</span><span style="color: #000000">"</span><span style="color: #000000"><br /><br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/200552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-05-23 18:27 <a href="http://www.cppblog.com/aaxron/archive/2013/05/23/200552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++嵌套类</title><link>http://www.cppblog.com/aaxron/archive/2013/04/22/199634.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 22 Apr 2013 07:05:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/04/22/199634.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/199634.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/04/22/199634.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/199634.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/199634.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;"stdafx.h"<br /><br /><span style="color: #008000; ">/*</span><span style="color: #008000; "><br />c++嵌套类<br />可以在另一个类内部定义一个类，这样的类嵌套类（nested&nbsp;class)<br />嵌套类是独立的类，基本上与它们外围类不相关，因此，外围类和嵌套类的对象是互相独立的。<br />嵌套类型的对象不具备外围类所定义的成员，同样，外围类的成员也不具备嵌套类所定义的成员。<br /><br />在一个类的内部定义另一个类，我们称之为嵌套类（nested&nbsp;class），或者嵌套类型。之所以引入这样一个嵌套类，往往是因为外围类需要使用嵌套类对象作为底层实现，并且该嵌套类只用于外围类的实现，且同时可以对用户隐藏该底层实现。<br /><br />虽然嵌套类在外围类内部定义，但它是一个独立的类，基本上与外围类不相关。它的成员不属于外围类，同样，外围类的成员也不属于该嵌套类。嵌套类的出现只是告诉外围类有一个这样的类型成员供外围类使用。并且，外围类对嵌套类成员的访问没有任何特权，嵌套类对外围类成员的访问也同样如此，它们都遵循普通类所具有的标号访问控制。<br /><br />若不在嵌套类内部定义其成员，则其定义只能写到与外围类相同的作用域中，且要用外围类进行限定，不能把定义写在外围类中。例如，嵌套类的静态成员就是这样的一个例子。<br /><br />前面说过，之所以使用嵌套类的另一个原因是达到底层实现隐藏的目的。为了实现这种目的，我们需要在另一个头文件中定义该嵌套类，而只在外围类中前向声明这个嵌套类即可。当然，在外围类外面定义这个嵌套类时，应该使用外围类进行限定。使用时，只需要在外围类的实现文件中包含这个头文件即可。<br /><br /><br />另外，嵌套类可以直接引用外围类的静态成员、类型名和枚举成员（假定这些成员是公有的）。类型名是一个typedef名字、枚举类型名、或是一个类名。<br /><br />在嵌套类的定义被看到之前我们只能声明嵌套类的指针和引用，如上面在A中定义为B&nbsp;m_b而不是B*&nbsp;m_b将会引发一个编译错误。<br />关于C++嵌套类的详细用法请参考《C++&nbsp;Primer&nbsp;第三版》P551。&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008000; ">*/</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">outerB.h<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">外围类outerB</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">class</span>&nbsp;outerB<br />{<br /><span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;outerB();<br />&nbsp;&nbsp;&nbsp;&nbsp;~outerB();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;show();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">嵌套类&nbsp;innerA</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;innerA<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;innerA();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~innerA();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;_show();<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><span style="color: #0000FF; ">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;innerA*&nbsp;&nbsp;m_p_innerA;<br />};<br /><br /><br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">outerB.cpp</span><span style="color: #008000; "><br /></span>outerB::outerB():m_p_innerA(<span style="color: #0000FF; ">new</span>&nbsp;innerA)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s&nbsp;\r\n",__FUNCTION__);<br />}<br /><br />outerB::~outerB()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s&nbsp;\r\n",__FUNCTION__);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(m_p_innerA!=NULL)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;m_p_innerA;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;outerB::show()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;m_p_innerA-&gt;_show();<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s&nbsp;\r\n",__FUNCTION__);<br />}<br />outerB::innerA::innerA()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s&nbsp;\r\n",__FUNCTION__);<br />}<br />outerB::innerA::~innerA()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s&nbsp;\r\n",__FUNCTION__);<br />}<br /><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;outerB::innerA::_show()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%s&nbsp;\r\n",__FUNCTION__);<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;_tmain(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;_TCHAR*&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;outerB&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;x.show();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">输出</span><span style="color: #008000; "><br />/*</span><span style="color: #008000; "><br />outerB::innerA::innerA<br />outerB::outerB<br />outerB::innerA::_show<br />outerB::show<br />outerB::~outerB<br />outerB::innerA::~innerA<br /></span><span style="color: #008000; ">*/</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/199634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-04-22 15:05 <a href="http://www.cppblog.com/aaxron/archive/2013/04/22/199634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求一个数，二进制表示中含有多少个1</title><link>http://www.cppblog.com/aaxron/archive/2013/03/18/198545.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 18 Mar 2013 07:02:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/03/18/198545.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/198545.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/03/18/198545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/198545.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/198545.html</trackback:ping><description><![CDATA[<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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">//</span><span style="color: #008000">&nbsp;1.&nbsp;求一个数，二进制表示中含有多少个1.</span><span style="color: #008000"><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;func(x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;countx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(x)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;countx&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x</span><span style="color: #000000">&amp;</span><span style="color: #000000">(x</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;countx;<br />}&nbsp;<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;2.&nbsp;请编写函数&nbsp;strcpy。</span><span style="color: #008000"><br /></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">strDest,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">strSrc)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;strDest&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;strSrc&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;必须</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;NULL&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;strDest&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;strSrc)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;good</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;strDest&nbsp;;<br />&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">tempptr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;strDest&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">strDest</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">strSrc</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;tempptr&nbsp;;<br />}<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;3.&nbsp;&nbsp;下面关于&#8220;联合&#8221;的题目的输出？</span><span style="color: #008000"><br /></span><span style="color: #000000">union&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;x[</span><span style="color: #000000">2</span><span style="color: #000000">];<br />}a;<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;a.x[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;a.x[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,a.i);<br />}<br /></span><span style="color: #008000">//</span><span style="color: #008000">答案：266&nbsp;(低位低地址，高位高地址，内存占用情况是Ox010A）<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;4.&nbsp;在C++&nbsp;程序中调用被C&nbsp;编译器编译后的函数，为什么要加&nbsp;extern&nbsp;"C"</span><span style="color: #008000"><br /></span><span style="color: #000000">首先，作为extern是C</span><span style="color: #000000">/</span><span style="color: #000000">C</span><span style="color: #000000">++</span><span style="color: #000000">语言中表明函数和全局变量作用范围（可见性）的关键字，该关键字告诉编译器，其声明的函数和变量可以在本模块或其它模块中使用。<br />通常，在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。<br />例如，如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。<br />这样，模块B中调用模块A中的函数时，在编译阶段，模块B虽然找不到该函数，但是并不会报错；它会在连接阶段中从模块A编译生成的目标代码中找到此函数<br /></span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">C</span><span style="color: #000000">"</span><span style="color: #000000">是连接申明(linkage&nbsp;declaration),被extern&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">C</span><span style="color: #000000">"</span><span style="color: #000000">修饰的变量和函数是按照C语言方式编译和连接的.<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;5.&nbsp;关联、聚合(Aggregation)以及组合(Composition)的区别？</span><span style="color: #008000"><br /></span><span style="color: #000000">关联&nbsp;&nbsp;是表示两个类的一般性联系，比如&#8220;学生&#8221;和&#8220;老师&#8221;就是一种关联关系；<br />聚合&nbsp;&nbsp;表示has</span><span style="color: #000000">-</span><span style="color: #000000">a的关系，是一种相对松散的关系，聚合类不需要对被聚合类负责，如下图所示，用空的菱形表示聚合关系：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;聚合可以表示为:&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A&nbsp;{};&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;B{&nbsp;A</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;a;&nbsp;..}<br />组合&nbsp;&nbsp;表示contains</span><span style="color: #000000">-</span><span style="color: #000000">a的关系，关联性强于聚合：组合类与被组合类有相同的生命周期，组合类要对被组合类负责，采用实心的菱形表示组合关系：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实现的形式是:&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A{};&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;B{&nbsp;A&nbsp;a;&nbsp;}<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;6.&nbsp;面向对象的三个基本特征，并简单叙述之？</span><span style="color: #008000"><br /></span><span style="color: #000000">1</span><span style="color: #000000">.&nbsp;封装：将客观事物抽象成类，每个类对自身的数据和方法实行protection(</span><span style="color: #0000ff">private</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">,</span><span style="color: #0000ff">public</span><span style="color: #000000">)<br /></span><span style="color: #000000">2</span><span style="color: #000000">.&nbsp;继承：广义的继承有三种实现形式：实现继承（指使用基类的属性和方法而无需额外编码的能力）、可视继承（子窗体使用父窗体的外观和实现代码）、<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口继承（仅使用属性和方法，实现滞后到子类实现）。前两种（类继承）和后一种（对象组合</span><span style="color: #000000">=&gt;</span><span style="color: #000000">接口继承以及纯虚函数）构成了功能复用的两种方式。<br /></span><span style="color: #000000">3</span><span style="color: #000000">.&nbsp;多态：是将父对象设置成为和一个或更多的他的子对象相等的技术，赋值之后，父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;简单的说，就是一句话：允许将子类类型的指针赋值给父类类型的指针。<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;7.&nbsp;多态的作用？</span><span style="color: #008000"><br /></span><span style="color: #000000">主要是两个：<br /></span><span style="color: #000000">1</span><span style="color: #000000">.&nbsp;隐藏实现细节，使得代码能够模块化；扩展代码模块，实现代码重用；<br /></span><span style="color: #000000">2</span><span style="color: #000000">.&nbsp;接口重用：为了类在继承和派生的时候，保证使用家族中任一类的实例的某一属性时的正确调用。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;8.&nbsp;New&nbsp;delete&nbsp;与malloc&nbsp;free&nbsp;的联系与区别?</span><span style="color: #008000"><br /></span><span style="color: #000000">答案：<br />都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数并且不能初始化对象，<br /></span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;会自动调用对象的构造函数。delete&nbsp;会调用对象的destructor，而free&nbsp;不会调用对象的destructor.<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;9.&nbsp;有哪几种情况只能用intialization&nbsp;list&nbsp;而不能用assignment?</span><span style="color: #008000"><br /></span><span style="color: #000000">答案：当类中含有const、reference&nbsp;成员变量；基类的构造函数都需要初始化表。<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;10.&nbsp;main&nbsp;函数执行以前，还会执行什么代码？</span><span style="color: #008000"><br /></span><span style="color: #000000">答案：全局对象的构造函数会在main&nbsp;函数之前执行。<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;11.&nbsp;描述内存分配方式以及它们的区别?</span><span style="color: #008000"><br /></span><span style="color: #000000">1</span><span style="color: #000000">）&nbsp;从静态存储区域分配。内存在程序编译的时候就已经分配好，这块内存在程序的整个运行期间都存在。例如全局变量，</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;变量。<br /></span><span style="color: #000000">2</span><span style="color: #000000">）&nbsp;在栈上创建。在执行函数时，函数内局部变量的存储单元都可以在栈上创建，函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。<br /></span><span style="color: #000000">3</span><span style="color: #000000">）&nbsp;从堆上分配，亦称动态内存分配。程序在运行的时候用malloc&nbsp;或new&nbsp;申请任意多少的内存，程序员自己负责在何时用free&nbsp;或delete&nbsp;释放内存。<br />&nbsp;&nbsp;&nbsp;&nbsp;动态内存的生存期由程序员决定，使用非常灵活，但问题也最多。<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;12.&nbsp;当一个类A&nbsp;中没有生命任何成员变量与成员函数,这时sizeof(A)的值是多少，如果不是零，请解释一下编译器为什么没有让它为零.</span><span style="color: #008000"><br /></span><span style="color: #000000">答案：肯定不是零。举个反例，如果是零的话，声明一个class&nbsp;A[</span><span style="color: #000000">10</span><span style="color: #000000">]对象数组，而每一个对象占用的空间是零，这时就没办法区分A[</span><span style="color: #000000">0</span><span style="color: #000000">],A[</span><span style="color: #000000">1</span><span style="color: #000000">]&#8230;了。<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;13.&nbsp;static_cast,&nbsp;dynamic_cast和reinterpret_cast的区别和应用</span><span style="color: #008000"><br /></span><span style="color: #000000">C风格的强制类型转换(Type&nbsp;Cast)很简单，不管什么类型的转换统统是：<br />TYPE&nbsp;b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(TYPE)a。<br />const_cast，字面上理解就是去const属性。<br />static_cast，命名上理解是静态类型转换。如int转换成char。<br />dynamic_cast，命名上理解是动态类型转换。如子类和父类之间的多台类型转换。<br />reinterpret_cast，仅仅重新解释类型，但没有进行二进制的转换。<br /></span><span style="color: #008000">//</span><span style="color: #008000">推荐:&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.shenmiguo.com/archives/2009/275_cplus-type-cast.html</span><span style="color: #008000"><br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;14.&nbsp;C++关键字：mutable、volatile、explicit以及__based</span><span style="color: #008000"><br /></span><span style="color: #0000ff">volatile</span><span style="color: #000000">:&nbsp;一个定义为volatile的变量是说这变量可能会被意想不到地改变，这样，编译器就不会去假设这个变量的值了。精确地说就是，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;优化器在用到这个变量时必须每次都小心地重新读取这个变量的值，而不是使用保存在寄存器里的备份。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.cnblogs.com/koya/articles/849158.html</span><span style="color: #008000"><br /></span><span style="color: #000000">mutable:&nbsp;他只能用于类的非静态和非常量数据成员.如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;也就是该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员进行赋值.这个时候就需要用mutable了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.360doc.com/content/10/0613/11/1595686_32846874.shtml</span><span style="color: #008000"><br /></span><span style="color: #0000ff">explicit</span><span style="color: #000000">:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;它的作用是</span><span style="color: #000000">"</span><span style="color: #000000">禁止单参数构造函数</span><span style="color: #000000">"</span><span style="color: #000000">被用于自动型别转换,典型的例子是容器类型,在这种类型的构造函数中你可以将初始长度作为参数传递给构造函数.<br />__based:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;该关键字主要用来解决一些和共享内存有关的问题,它允许指针被定义为从某一点开始算的32位偏移值,而不是内存种的绝对位置<br /><br /></span><span style="color: #0000ff">explicit</span><span style="color: #000000">&nbsp;它的作用是</span><span style="color: #000000">"</span><span style="color: #000000">禁止单参数的构造函数</span><span style="color: #000000">"</span><span style="color: #000000">被用于后台自动类型转换,意味着单参数构造函数不能用来创建隐式临时对象！<br />否则一些宽松的规则将允许在没有显式类型转换操作的情况下进行类型转换。<br />考虑下面的例子：<br />IntCell&nbsp;obj;<br />obj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">37</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">should&nbsp;not&nbsp;compile:type&nbsp;mismatch</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />C</span><span style="color: #000000">++</span><span style="color: #000000">拥有宽松的规则，通常，单参数构造函数定义了一个隐式类型转换，该转换创建一个临时对象，从而赋值（或函数参数）变成兼容的。<br />在本例中，编译器试图将<br />obj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">37</span><span style="color: #000000">;<br />转换为<br />IntCell&nbsp;tempobj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">37</span><span style="color: #000000">;<br />obj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tempobj;<br /><br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;15.&nbsp;类成员函数的重载、覆盖和隐藏区别？</span><span style="color: #008000"><br /></span><span style="color: #000000">a.成员函数被重载的特征：<br />（</span><span style="color: #000000">1</span><span style="color: #000000">）相同的范围（在同一个类中）；<br />（</span><span style="color: #000000">2</span><span style="color: #000000">）函数名字相同；<br />（</span><span style="color: #000000">3</span><span style="color: #000000">）参数不同；<br />（</span><span style="color: #000000">4</span><span style="color: #000000">）</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;关键字可有可无。<br />b.覆盖是指派生类函数覆盖基类函数，特征是：<br />（</span><span style="color: #000000">1</span><span style="color: #000000">）不同的范围（分别位于派生类与基类）；<br />（</span><span style="color: #000000">2</span><span style="color: #000000">）函数名字相同；<br />（</span><span style="color: #000000">3</span><span style="color: #000000">）参数相同；<br />（</span><span style="color: #000000">4</span><span style="color: #000000">）基类函数必须有virtual&nbsp;关键字。<br />c.&#8220;隐藏&#8221;是指派生类的函数屏蔽了与其同名的基类函数，规则如下：<br />（</span><span style="color: #000000">1</span><span style="color: #000000">）如果派生类的函数与基类的函数同名，但是参数不同。此时，不论有无virtual关键字，基类的函数将被隐藏（注意别与重载混淆）。<br />（</span><span style="color: #000000">2</span><span style="color: #000000">）如果派生类的函数与基类的函数同名，并且参数也相同，但是基类函数没有virtual&nbsp;关键字。此时，基类的函数被隐藏（注意别与覆盖混淆）<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;16.&nbsp;如何打印出当前源文件的文件名以及源文件的当前行号？</span><span style="color: #008000"><br /></span><span style="color: #000000">cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;__FILE__&nbsp;;<br />cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">__LINE__&nbsp;;<br />__FILE__和__LINE__是系统预定义宏，这种宏并不是在某个文件中定义的，而是由编译器定义的。<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;17.&nbsp;main&nbsp;主函数执行完毕后，是否可能会再执行一段代码，给出说明？</span><span style="color: #008000"><br /></span><span style="color: #000000">答案：可以，可以用_onexit&nbsp;注册一个函数，它会在main&nbsp;之后执行.<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;18.&nbsp;如何判断一段程序是由C&nbsp;编译程序还是由C++编译程序编译的？</span><span style="color: #008000"><br /></span><span style="color: #000000">#ifdef&nbsp;__cplusplus<br />&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">c++</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">#else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">c</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /><br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;IntCell<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">explicit</span><span style="color: #000000">&nbsp;IntCell(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;val</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">):m_val(val){}<br /></span><span style="color: #0000ff">private</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m_val;<br />};<br /><br /><br /></span></div><img src ="http://www.cppblog.com/aaxron/aggbug/198545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-03-18 15:02 <a href="http://www.cppblog.com/aaxron/archive/2013/03/18/198545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言实现有限状态机</title><link>http://www.cppblog.com/aaxron/archive/2013/03/04/198217.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Mon, 04 Mar 2013 10:00:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/03/04/198217.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/198217.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/03/04/198217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/198217.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/198217.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">C语言实现有限状态机<br /><br />有限状态机(finite&nbsp;state&nbsp;machine)是一个数学概念，如果把它运用于程序中，可以发挥很大的作用。它是一种协议，用于有限数量的子程序(&#8221;状态&#8221;)的发展变化。每个子程序进行一些处理并选择下一种状态(通常取决于下一段输入)。<br /><br />有限状态机(FSM)可以用作程序的控制结构。FSM对于那些基于输入的在几个不同的可选动作中进行循环的程序尤其合适。投币售货机就是FSM的一个好例子。另外一个你可以想到的复杂的例子就是你正在用的东西，想到了吗？没错，就是操作系统。在投币售货机的例子中，输入是硬币，输出是待售商品，售货机有&#8221;&nbsp;接受硬币&#8221;，&#8221;选择商品&#8221;，&#8221;发送商品&#8221;和&#8221;找零钱&#8221;等几种状态。<br /><br />它的基本思路是用一张表保存所有可能的状态，并列出进入每个状态时可能执行的所有动作，其中最后一个动作就是计算(通常在当前状态和下一次输入字符的基础上，另外再经过一次表查询)下一个应该进入的状态。你从一个&#8221;初始状态&#8221;&nbsp;开始。在这一过程中，翻译表可能告诉你进入了一个错误状态，直到到达结束状态。<br /><br />在C语言中，有好几种方法可以用来表达FSM，但它们绝大多数都是基于函数指针数组。一个函数指针数组可以像下面这样声明：<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">state[MAX_STATES])&nbsp;();<br /><br />如果知道了函数名，就可以像下面这样对数组进行初始化。<br /><br /></span><span style="color: #0000FF; ">extern</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a(),b(),c(),d();<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">state[])&nbsp;()</span><span style="color: #000000; ">=</span><span style="color: #000000; ">{a,b,c,c};<br /><br />可以通过数组中的指针来调用函数：<br />(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">state[i])&nbsp;();<br /><br />所有函数必须接受同样的参数，并返回同种类型的返回值(除非你把数组元素做成一个联合)。函数指针是很有趣的。注意，我们可以去掉指针形式，把上面的调用写成：<br /><br />state[i]&nbsp;();<br /><br />甚至<br />(</span><span style="color: #000000; ">***</span><span style="color: #000000; ">state[i])&nbsp;();<br /><br />这是一个在ANSI&nbsp;C中流行的不良方法：调用函数和通过指针调用函数(或任意层次的指针间接引用)可以使用同一种语法。<br /><br />如果你想干得漂亮一点，可以让状态函数返回一个指向通用后续函数的指针，并把它转换为适当的类型。这样，就不需要全局变量了。如果你不想搞得太花哨，可以使用一个switch语句作为一种简朴的状态机，方法是赋值给控制变量并把switch语句放在循环内部。关于FSM还有最后一点需要说明：如果你的状态函数看上去需要多个不同的参数，可以考虑使用一个参数计数器和一个字符串指针数组，就像main函数的参数一样。我们熟悉的int&nbsp;argc,</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">argv[]机制是非常普遍的，可以成功地应用在你所定义的函数中</span></div><img src ="http://www.cppblog.com/aaxron/aggbug/198217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-03-04 18:00 <a href="http://www.cppblog.com/aaxron/archive/2013/03/04/198217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++整数、浮点数、结构体的返回值</title><link>http://www.cppblog.com/aaxron/archive/2013/03/01/198151.html</link><dc:creator>天下</dc:creator><author>天下</author><pubDate>Fri, 01 Mar 2013 02:16:00 GMT</pubDate><guid>http://www.cppblog.com/aaxron/archive/2013/03/01/198151.html</guid><wfw:comment>http://www.cppblog.com/aaxron/comments/198151.html</wfw:comment><comments>http://www.cppblog.com/aaxron/archive/2013/03/01/198151.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/aaxron/comments/commentRss/198151.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/aaxron/services/trackbacks/198151.html</trackback:ping><description><![CDATA[<p>&nbsp;</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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><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 /><br /><br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sex;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;name[</span><span style="color: #000000">20</span><span style="color: #000000">];<br />};<br /><br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person&nbsp;GetPerson(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sex,</span><span style="color: #0000ff">char</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;name)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person&nbsp;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;p.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />&nbsp;&nbsp;&nbsp;&nbsp;p.sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sex;<br />&nbsp;&nbsp;&nbsp;&nbsp;strcpy(p.name,name);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;p;<br />}<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0x7ffff123</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0x7ffff456</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;k&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0x7fffffff</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">汇编指令:imul,mul</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">)(m&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;n);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回值类型为&nbsp;int,然后强制转换为long&nbsp;long,最后赋值给x,</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">)m&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;n;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回值类型为&nbsp;long&nbsp;long,然后赋值给y,注意强制类型转换括号的位置,</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;n;&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">返回值类型为&nbsp;int,然后赋值给x.</span><span style="color: #008000"><br />/*</span><span style="color: #008000"><br />汇编指令:<br />&nbsp;&nbsp;&nbsp;&nbsp;004114BC&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[m]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004114BF&nbsp;&nbsp;imul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[n]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004114C3&nbsp;&nbsp;cdq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据扩展指令，将双字数据扩展为四字类型<br />&nbsp;&nbsp;&nbsp;&nbsp;//CDQ&#8212;Convert&nbsp;Double&nbsp;to&nbsp;Quad&nbsp;(386+)，该指令把edx扩展为eax的高位，也就是说变为64位。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004114C4&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[z],eax&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004114C7&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp-4Ch],edx&nbsp;<br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">m&nbsp;=&nbsp;%d,n&nbsp;=&nbsp;%d&nbsp;\n</span><span style="color: #000000">"</span><span style="color: #000000">,m,n);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">x&nbsp;=&nbsp;%lld\n</span><span style="color: #000000">"</span><span style="color: #000000">,x);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">y&nbsp;=&nbsp;%lld\n</span><span style="color: #000000">"</span><span style="color: #000000">,y);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">z&nbsp;=&nbsp;%lld\n</span><span style="color: #000000">"</span><span style="color: #000000">,z);<br /><br /><br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">8</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;k1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m1</span><span style="color: #000000">/</span><span style="color: #000000">n1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;k2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m1</span><span style="color: #000000">/</span><span style="color: #000000">n1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回值类型为&nbsp;int,然后赋值给k2,汇编指令:idiv</span><span style="color: #008000"><br />/*</span><span style="color: #008000"><br />汇编指令:<br />&nbsp;&nbsp;&nbsp;&nbsp;0041155E&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[m1]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411561&nbsp;&nbsp;cdq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411562&nbsp;&nbsp;idiv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[n1]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411565&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp-1F4h],eax&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;0041156B&nbsp;&nbsp;fild&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp-1F4h]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411571&nbsp;&nbsp;fstp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qword&nbsp;ptr&nbsp;[k2]&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;fild和fstp都是x87指令&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;fild浮点加载整数&nbsp;然后转换为长双精度&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;fild是将整数转化为长双精FP80压栈（压到st0）,<br />&nbsp;&nbsp;&nbsp;&nbsp;fstp是将弹栈指令，将st0弹出。<br /><br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;k3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">double</span><span style="color: #000000">)(m1</span><span style="color: #000000">/</span><span style="color: #000000">n1);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回值类型为&nbsp;int,然后强制转换为double,最后赋值给k3,汇编指令:idiv</span><span style="color: #008000"><br /></span><span style="color: #000000"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;k4&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">double</span><span style="color: #000000">)m1</span><span style="color: #000000">/</span><span style="color: #000000">n1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">返回值类型为double,然后赋值给k4,注意强制类型转换括号的位置,汇编指令:fidiv</span><span style="color: #008000"><br />/*</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;汇编指令:<br />&nbsp;&nbsp;&nbsp;&nbsp;00411590&nbsp;&nbsp;fild&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[m1]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411593&nbsp;&nbsp;fidiv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[n1]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411596&nbsp;&nbsp;fstp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qword&nbsp;ptr&nbsp;[k4]&nbsp;<br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">k1=%d&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,k1);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">k2=%f&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,k2);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">k3=%f&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,k3);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">k4=%f&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,k4);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;l1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">127</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;l2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">122</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;l3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l1</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;l2;<br /></span><span style="color: #008000">/*</span><span style="color: #008000"><br />汇编指令:<br />&nbsp;&nbsp;&nbsp;&nbsp;0041162E&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,byte&nbsp;ptr&nbsp;[l1]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411635&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,byte&nbsp;ptr&nbsp;[l2]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;0041163C&nbsp;&nbsp;imul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,ecx&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;0041163F&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[l3],eax&nbsp;<br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;l4&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l1</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;l2;<br /></span><span style="color: #008000">/*</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;汇编指令:<br />&nbsp;&nbsp;&nbsp;&nbsp;00411645&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,byte&nbsp;ptr&nbsp;[l1]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;0041164C&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,byte&nbsp;ptr&nbsp;[l2]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411653&nbsp;&nbsp;imul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,ecx&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;00411656&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;ptr&nbsp;[l4],al&nbsp;<br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l5&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l1</span><span style="color: #000000">/</span><span style="color: #000000">l2;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l6&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">(l1)</span><span style="color: #000000">/</span><span style="color: #000000">l2;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;k5&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l1</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;l2;<br /></span><span style="color: #008000">/*</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;汇编指令:<br />&nbsp;&nbsp;&nbsp;&nbsp;004116A6&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,byte&nbsp;ptr&nbsp;[l1]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004116AD&nbsp;&nbsp;movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,byte&nbsp;ptr&nbsp;[l2]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004116B4&nbsp;&nbsp;imul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,ecx&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004116B7&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp-1F4h],eax&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004116BD&nbsp;&nbsp;fild&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[ebp-1F4h]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;004116C3&nbsp;&nbsp;fstp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qword&nbsp;ptr&nbsp;[k5]&nbsp;<br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">l3=%d&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,l3);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">l4=%d&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,l4);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">k4=%lf&nbsp;\r\n</span><span style="color: #000000">"</span><span style="color: #000000">,k5);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;o1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0xff34567812345677</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;o2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0xab34567834125615</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;o3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;o1&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;o2;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">溢出</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;name[</span><span style="color: #000000">20</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Aaron</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person&nbsp;p1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{</span><span style="color: #000000">5</span><span style="color: #000000">,</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">Aaron</span><span style="color: #000000">"</span><span style="color: #000000">};<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person&nbsp;p2;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pp1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">p1;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pp2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">p2;<br />&nbsp;&nbsp;&nbsp;&nbsp;p2</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p1;<br /></span><span style="color: #008000">/*</span><span style="color: #008000"><br />汇编指令:<br />00414348&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,7&nbsp;<br />0041434D&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esi,[ebp-188h]&nbsp;<br />00414353&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edi,[ebp-1ACh]&nbsp;<br />00414359&nbsp;&nbsp;rep&nbsp;movs&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;es:[edi],dword&nbsp;ptr&nbsp;[esi]&nbsp;<br /><br />//ecx&nbsp;是计数器(counter)，是重复(REP)前缀指令和LOOP指令的内定计数器。<br />因为sizeof(person)&nbsp;=&nbsp;28,所以才有mov&nbsp;ecx,7&nbsp;<br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;person&nbsp;p3;<br />&nbsp;&nbsp;&nbsp;&nbsp;p3</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetPerson(age,sex,name);<br /><br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">结论:</span><span style="color: #008000"><br />/*</span><span style="color: #008000"><br />整数类型:<br />&nbsp;&nbsp;&nbsp;&nbsp;小于等于4字节的返回值放在eax中,<br />&nbsp;&nbsp;&nbsp;&nbsp;8字节的返回值放在edx&nbsp;+&nbsp;eax中,其中edx为高位,eax为低位.<br /><br />浮点数类型:<br />计算是通过压栈的方式,如汇编指令:fild<br />返回是通过出栈的方式,如汇编指令:fstp<br /><br />结构体类型赋值:<br />是通过内存拷贝的方式,如汇编指令:rep&nbsp;movs<br />将源值的地址放入esi,<br />将目标值的地址放入edi,<br /><br />00414393&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esi,[ebp-2D8h]&nbsp;<br />00414399&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edi,[ebp-1D0h]&nbsp;<br />0041439F&nbsp;&nbsp;rep&nbsp;movs&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;es:[edi],dword&nbsp;ptr&nbsp;[esi]&nbsp;<br /><br /><br /><font color="#008000">结构体类型</font>返回值:<br />通过eax将结构体的<font color="#008000">指针</font>返回<br /></span><span style="color: #008000">*/</span><span style="color: #000000"><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="color: #000000">"</span><span style="color: #000000">pause</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&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 />}<br /></span><span style="color: #008000">//</span><span style="color: #008000">111111111111111111111111111111<br /></span><span style="color: #008000">//</span><span style="color: #008000">00000000000000000000000000000001<br /></span><span style="color: #008000">//</span><span style="color: #008000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">111111111111111111001010111100<br /></span><span style="color: #008000">//</span><span style="color: #008000">10000000101011010101110111000010<br /></span><span style="color: #008000">//</span><span style="color: #008000">取反加一&nbsp;1111111010100101010001000111110<br /></span><span style="color: #008000">//</span><span style="color: #008000">11111001111111111111111111111110000011000<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">11111111111111111111110000011000<br /></span><span style="color: #008000">//</span><span style="color: #008000">1111101000<br /><br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">11111010000000000000000000000000000000000&nbsp;=&nbsp;0<br /></span><span style="color: #008000">//</span><span style="color: #008000">00000000000000000000000000000000<br /></span><span style="color: #008000">//</span><span style="color: #008000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">1111111111111111111110000011000</span></div>
<p>&nbsp;</p><img src ="http://www.cppblog.com/aaxron/aggbug/198151.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/aaxron/" target="_blank">天下</a> 2013-03-01 10:16 <a href="http://www.cppblog.com/aaxron/archive/2013/03/01/198151.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>