﻿<?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++基础知识</title><link>http://www.cppblog.com/weining45/category/19259.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 20 Jun 2012 11:53:59 GMT</lastBuildDate><pubDate>Wed, 20 Jun 2012 11:53:59 GMT</pubDate><ttl>60</ttl><item><title>操作技巧</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177608.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:30:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177608.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177608.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177608.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177608.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177608.html</trackback:ping><description><![CDATA[<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">ALT+F8</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">：调整代码格式</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><strong>&nbsp;</strong></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">1.</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">在Project|Setting中的Link标签页的Object/library &nbsp; Modules &nbsp; 中加入*.lib(用空格隔开多个*.lib) </span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">2.</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">在Tools|Options中的Directories &nbsp; 标签页中的 &nbsp; Show &nbsp; directories &nbsp; for:下面的 Include &nbsp; files &nbsp; 中增加Myclass.h的路径；Lib &nbsp; files中增加*.lib &nbsp; 和*.dll路径。</span></p><img src ="http://www.cppblog.com/weining45/aggbug/177608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:30 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177608.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>新建对象</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177606.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:28:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177606.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177606.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177606.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177606.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177606.html</trackback:ping><description><![CDATA[<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">C++</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">中只有使用new创建的新对象才是在堆中分配内存</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">如果有类ClassA，则ClassA a创建一个对象a，如果不想创建对象，而只是声明一个句柄，则需要使用指针。</span></p><img src ="http://www.cppblog.com/weining45/aggbug/177606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:28 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>using namespace std</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177604.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:26:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177604.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177604.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177604.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177604.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177604.html</trackback:ping><description><![CDATA[<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">如果要使用别的工程的文件，比如A工程的a.cpp要包括B工程的b.h，那么a.cpp里面要使用相对路径来指定这个b.h 的路径，而不能直接写成#include "b.h"这样的。另一种更好的跟能移植的解决方案就是：设置A工程的属性:project-&gt;project settings,选中A工程，然后到c++标签，拉到preprocesser,在additonal include directories中加入B工程的路径，这样就可以直接使用#include "b.h"在A工程使用了。</span></p><img src ="http://www.cppblog.com/weining45/aggbug/177604.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:26 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177604.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>虚析构函数</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177603.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:26:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177603.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177603.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177603.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177603.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177603.html</trackback:ping><description><![CDATA[<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">源于<span lang="EN-US">C++</span>的继承机制，在设计作为父类的类时，需要将其析构函数设计为虚函数，以便于将来使用父类指针删除子类对象时，确保子类的析构函数会被调用。<span lang="EN-US"><o:p></o:p></span></span></p><img src ="http://www.cppblog.com/weining45/aggbug/177603.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:26 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LNK2001</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177601.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:21:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177601.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177601.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177601.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177601.html</trackback:ping><description><![CDATA[<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">学习<span lang="EN-US">VC</span>＋＋时经常会遇到链接错误<span lang="EN-US">LNK2001</span>，该错误非常讨厌，因为对于编程者来说，最好改的错误莫过于编译错误，而一般说来发生连接错误时，编译都已通过。产生连接错误的原因非常多，尤其<span lang="EN-US">LNK2001</span>错误，常常使人不明其所以然。如果不深入地学习和理解<span lang="EN-US">VC</span>＋＋，要想改正连接错误<span lang="EN-US">LNK2001</span>非常困难。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">初学者在学习<span lang="EN-US">VC</span>＋＋的过程中，遇到的<span lang="EN-US">LNK2001</span>错误的错误消息主要为：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　<span lang="EN-US">unresolved external symbol &#8220;symbol&#8221;</span>（不确定的外部<span lang="EN-US">&#8220;</span>符号<span lang="EN-US">&#8221;</span>）<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签，将产生此错误消息。一般来说，发生错误的原因有两个：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">一是所引用的函数、变量不存在、拼写不正确或者使用错误<span lang="EN-US">;<br /></span>二是可能使用了不同版本的连接库<span lang="EN-US">;<o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　以下是可能产生<span lang="EN-US">LNK2001</span>错误的原因：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　一．由于编码错误导致的<span lang="EN-US">LNK2001</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　<span lang="EN-US">1</span>．不相匹配的程序代码或模块定义（<span lang="EN-US">.DEF</span>）文件能导致<span lang="EN-US">LNK2001</span>。例如<span lang="EN-US">,</span>如果在<span lang="EN-US">C</span>＋＋ 源文件内声明了一变量<span lang="EN-US">&#8220;var1&#8221;</span>，却试图在另一文件内以变量<span lang="EN-US">&#8220;VAR1&#8221;</span>访问该变量<span lang="EN-US">,</span>将发生该错误。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　<span lang="EN-US">2</span>．如果使用的内联函数是在<span lang="EN-US">.CPP</span>文件内定义的，而不是在头文件内定义将导致<span lang="EN-US">LNK2001</span>错误。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　<span lang="EN-US">3</span>．调用函数时如果所用的参数类型同函数声明时的类型不符将会产生<span lang="EN-US">LNK2001</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　<span lang="EN-US">4</span>．试图从基类的构造函数或析构函数中调用虚拟函数时将会导致<span lang="EN-US">LNK2001</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　<span lang="EN-US">5</span>．要注意函数和变量的可公用性，只有全局变量、函数是可公用的。静态函数和静态变量具有相同的使用范围限制。当试图从文件外部访问任何没有在该文件内声明的静态变量时将导致编译错误或<span lang="EN-US">LNK2001</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　函数内声明的变量（局部变量） 只能在该函数的范围内使用。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　<span lang="EN-US">C</span>＋＋ 的全局常量只有静态连接性能。这不同于<span lang="EN-US">C</span>，如果试图在<span lang="EN-US">C</span>＋＋的多个文件内使用全局变量也会产生<span lang="EN-US">LNK2001</span>错误。一种解决的方法是需要时在头文件中加入该常量的初始化代码，并在<span lang="EN-US">.CPP</span>文件中包含该头文件；另一种方法是使用时给该变量赋以常数。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　二．由于编译和链接的设置而造成的<span lang="EN-US">LNK2001<o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　<span lang="EN-US">1</span>．如果编译时使用的是<span lang="EN-US">/NOD</span>（<span lang="EN-US">/NODEFAULTLIB</span>）选项，程序所需要的运行库和<span lang="EN-US">MFC</span>库在连接时由编译器写入目标文件模块， 但除非在文件中明确包含这些库名，否则这些库不会被链接进工程文件。在这种情况下使用<span lang="EN-US">/NOD</span>将导致错误<span lang="EN-US">LNK2001</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　<span lang="EN-US">2</span>．如果没有为<span lang="EN-US">wWinMainCRTStartup</span>设定程序入口，在使用<span lang="EN-US">Unicode</span>和<span lang="EN-US">MFC</span>时将得到<span lang="EN-US">&#8220;unresolved external on _WinMain@16&#8221;</span>的<span lang="EN-US">LNK2001</span>错误信息。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　<span lang="EN-US">3</span>．使用<span lang="EN-US">/MD</span>选项编译时<span lang="EN-US">,</span>既然所有的运行库都被保留在动态链接库之内，源文件中对<span lang="EN-US">&#8220;func&#8221;</span>的引用，在目标文件里即对<span lang="EN-US">&#8220;__imp__func&#8221; </span>的引用。如果试图使用静态库<span lang="EN-US">LIBC.LIB</span>或<span lang="EN-US">LIBCMT.LIB</span>进行连接，将在<span lang="EN-US">__imp__func</span>上发<span lang="EN-US"><br /></span>生<span lang="EN-US">LNK2001</span>；如果不使用<span lang="EN-US">/MD</span>选项编译，在使用<span lang="EN-US">MSVCxx.LIB</span>连接时也会发生<span lang="EN-US">LNK2001</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　<span lang="EN-US">4</span>．使用<span lang="EN-US">/ML</span>选项编译时，如用<span lang="EN-US">LIBCMT.LIB</span>链接会在<span lang="EN-US">_errno</span>上发生<span lang="EN-US">LNK2001</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　<span lang="EN-US">5</span>．当编译调试版的应用程序时，如果采用发行版模态库进行连接也会产生<span lang="EN-US">LNK2001</span>；同样，使用调试版模态库连接发行版应用程序时也会产生相同的问题。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　<span lang="EN-US">6</span>．不同版本的库和编译器的混合使用也能产生问题，因为新版的库里可能包含早先的版本没有的符号和说明。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　<span lang="EN-US">7</span>．在不同的模块使用内联和非内联的编译选项能够导致<span lang="EN-US">LNK2001</span>。如果创建<span lang="EN-US">C</span>＋＋库时打开了函数内联（<span lang="EN-US">/Ob1</span>或<span lang="EN-US">/Ob2</span>），但是在描述该函数的相应头文件里却关闭了函数内联（没有<span lang="EN-US">inline</span>关键字），这时将得到该错误信息。为避免该问题的发生，应该在相应的头文件中用<span lang="EN-US">inline</span>关键字标志内联函数。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　<span lang="EN-US">8</span>．不正确的<span lang="EN-US">/SUBSYSTEM</span>或<span lang="EN-US">/ENTRY</span>设置也能导致<span lang="EN-US">LNK2001</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="background: white"><span style="font-family: '微软雅黑','sans-serif'; color: black; font-size: 9pt; mso-bidi-font-family: Tahoma">　　其实，产生<span lang="EN-US">LNK2001</span>的原因还有很多，以上的原因只是一部分而已，对初学者来说这些就够理解一阵子了。但是，分析错误原因的目的是为了避免错误的发生。<span lang="EN-US">LNK2001</span>错误虽然比较困难，但是只要注意到了上述问题，还是能够避免和予以解决的。<span lang="EN-US"><o:p></o:p></span></span></p><img src ="http://www.cppblog.com/weining45/aggbug/177601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:21 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>__declspec(dllimport)</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177600.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:20:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177600.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177600.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177600.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177600.html</trackback:ping><description><![CDATA[<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">声明一个导入函数，是说这个函数是从别的<span lang="EN-US">DLL</span>导入。我要用。一般用于使用某个<span lang="EN-US">dll</span>的<span lang="EN-US">exe</span>中不使用<span lang="EN-US"> __declspec(dllimport) </span>也能正确编译代码，但使用<span lang="EN-US"> __declspec(dllimport) </span>使编译器可以生成更好的代码。编译器之所以能够生成更好的代码，是因为它可以确定函数是否存在于<span lang="EN-US"> DLL </span>中，这使得编译器可以生成跳过间接寻址级别的代码，而这些代码通常会出现在跨<span lang="EN-US"> DLL </span>边界的函数调用中。但是，必须使用<span lang="EN-US"> __declspec(dllimport) </span>才能导入<span lang="EN-US"> DLL </span>中使用的变量。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">dllimport</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">是为了更好的处理类中的静态成员变量<span lang="EN-US">(</span>或者其他<span lang="EN-US">...)</span>的，如果没有静态成员变量<span lang="EN-US">(</span>或者其他<span lang="EN-US">...)</span>，那么这个<span lang="EN-US">__declspec(dllimport)</span>无所谓<span lang="EN-US">.<o:p></o:p></span></span></p>
<p style="text-align: left; line-height: 150%; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: '微软雅黑','sans-serif'; color: #990033; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">函数的导入</span><span style="line-height: 150%; font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">当你需要使用<span lang="EN-US">DLL</span>中的函数时，往往不需要显示地导入函数，编译器可自动完成。但如果你显示地导入函数，编译器会产生质量更好的代码。由于编译器确切地知道了一个函数是否在一个<span lang="EN-US">DLL</span>中，它就可以产生更好的代码，不再需要间接的调用转接。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp; Win32</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">的<span lang="EN-US">PE</span>格式（<span lang="EN-US">Portable Executable Format</span>）把所有导入地址放在一个导入地址表中。下面用一个具体实例说明使用<span lang="EN-US">__declspec(dllimport)</span>导入函数和不使用的区别：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">假设<span lang="EN-US">func</span>是一个<span lang="EN-US">DLL</span>中的函数，现在在要生成的<span lang="EN-US">.exe</span>的<span lang="EN-US">main</span>函数中调用<span lang="EN-US">func</span>函数，并且不显示地导入<span lang="EN-US">func</span>函数（即没有：<span lang="EN-US">__declspec(dllimport)</span>），代码示例如下：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp; int main()<o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp; {<o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; func();<o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">编译器将产生类似这样的调用代码：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp; call func<o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">然后，链接器把该调用翻译为类似这样的代码：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp; call 0x40000001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; ox40000001</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">是<span lang="EN-US">"func"</span>的地址<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">并且，链接器将产生一个<span lang="EN-US">Thunk</span>，形如：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp; 0x40000001: jmp DWORD PTR __imp_func<o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">这里的<span lang="EN-US">imp_func</span>是<span lang="EN-US">func</span>函数在<span lang="EN-US">.exe</span>的导入地址表中的函数槽的地址。然后，加载器只需要在加载时更新<span lang="EN-US">.exe</span>的导入地址表即可。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">而如果使用了<span lang="EN-US">__declspec(dllimport)</span>显示地导入函数，那么链接器就不会产生<span lang="EN-US">Thunk</span>（如果不被要求的话），而直接产生一个间接调用。因此，下面的代码：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp; __declspec(dllimport) void func1(void);<br />&nbsp;&nbsp; void main(void) <br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; func1();<br />&nbsp;&nbsp;&nbsp; }<o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">将调用如下调用指令：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp; call DWORD PTR __imp_func1<o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">因此，显示地导入函数能有效减少目标代码（因为不产生<span lang="EN-US">Thunk</span>）。另外，在<span lang="EN-US">DLL</span>中使用<span lang="EN-US">DLL</span>外的函数也可以这样做，从而提高空间和时间效率。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-align: left; line-height: 150%; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: '微软雅黑','sans-serif'; color: #990033; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">变量的导入</span><span style="line-height: 150%; font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 150%; margin: 0cm 0cm 0pt; word-break: break-all; mso-pagination: widow-orphan; mso-margin-top-alt: auto; mso-margin-bottom-alt: auto" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><span style="line-height: 150%; font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">与函数不同的是，在使用<span lang="EN-US">DLL</span>中的变量时，需要显示地导入变量。使用<span lang="EN-US">__declspec(dllimport)</span>关键字导入变量。若在<span lang="EN-US">DLL</span>中使用<span lang="EN-US">.def</span>导出变量，则应使用<span lang="EN-US">DATA</span>修饰变量，而不是使用已经被遗弃的<span lang="EN-US">CONSTANT</span>。因为<span lang="EN-US">CONSTANT</span>可能需要使用指针间接访问变量，不确定什么时候会出问题。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-align: left; line-height: 150%; margin: 3.15pt 0cm; word-break: break-all; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">我相信写<span lang="EN-US">WIN32</span>程序的人，做过<span lang="EN-US">DLL</span>，都会很清楚<span lang="EN-US">__declspec(dllexport)</span>的作用，它就是为了省掉在<span lang="EN-US">DEF</span>文件中手工定义导出哪些函数的一个方法。当然，如果你的<span lang="EN-US">DLL</span>里全是<span lang="EN-US">C++</span>的类的话，你无法在<span lang="EN-US">DEF</span>里指定导出的函数，只能用<span lang="EN-US">__declspec(dllexport)</span>导出类。但是，<span lang="EN-US">MSDN</span>文档里面，对于<span lang="EN-US">__declspec(dllimport)</span>的说明让人感觉有点奇怪，先来看看<span lang="EN-US">MSDN</span>里面是怎么说的： <span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-align: left; line-height: 150%; margin: 3.15pt 0cm; word-break: break-all; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">不使用<span lang="EN-US"> __declspec(dllimport) </span>也能正确编译代码，但使用<span lang="EN-US"> __declspec(dllimport) </span>使编译器可以生成更好的代码。编译器之所以能够生成更好的代码，是因为它可以确定函数是否存在于<span lang="EN-US"> DLL </span>中，这使得编译器可以生成跳过间接寻址级别的代码，而这些代码通常会出现在跨<span lang="EN-US"> DLL </span>边界的函数调用中。但是，必须使用<span lang="EN-US"> __declspec(dllimport) </span>才能导入<span lang="EN-US"> DLL </span>中使用的变量。 <span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-align: left; line-height: 150%; margin: 3.15pt 0cm; word-break: break-all; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">初看起来，这段话前面的意思是，不用它也可以正常使用<span lang="EN-US">DLL</span>的导出库，但最后一句话又说，必须使用<span lang="EN-US"> __declspec(dllimport) </span>才能导入<span lang="EN-US"> DLL </span>中使用的变量这个是什么意思？？<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-align: left; line-height: 150%; margin: 3.15pt 0cm; word-break: break-all; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">那我就来试验一下，假定，你在<span lang="EN-US">DLL</span>里只导出一个简单的类，注意，我假定你已经在项目属性中定义了<span lang="EN-US"> SIMPLEDLL_EXPORT<br />SimpleDLLClass.h<o:p></o:p></span></span></p>
<p style="text-align: left; line-height: 150%; margin: 3.15pt 0cm; word-break: break-all; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">#ifdef SIMPLEDLL_EXPORT#define DLL_EXPORT __declspec(dllexport)#else#define DLL_EXPORT#endifclass DLL_EXPORT SimpleDLLClass{public:&nbsp;SimpleDLLClass();&nbsp;virtual ~SimpleDLLClass();&nbsp;virtual getValue() { return m_nValue;};private:&nbsp;int m_nValue;};SimpleDLLClass.cpp<o:p></o:p></span></p>
<p style="text-align: left; line-height: 150%; margin: 3.15pt 0cm; word-break: break-all; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">#include "SimpleDLLClass.h"SimpleDLLClass::SimpleDLLClass(){&nbsp;m_nValue=0;}SimpleDLLClass::~SimpleDLLClass(){}</span><span style="line-height: 150%; font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">然后你再使用这个<span lang="EN-US">DLL</span>类，在你的<span lang="EN-US">APP</span>中<span lang="EN-US">include SimpleDLLClass.h</span>时，你的<span lang="EN-US">APP</span>的项目不用定义<span lang="EN-US"> SIMPLEDLL_EXPORT </span>所以，<span lang="EN-US">DLL_EXPORT </span>就不会存在了，这个时候，你在<span lang="EN-US">APP</span>中，不会遇到问题。这正好对应<span lang="EN-US">MSDN</span>上说的<span lang="EN-US">__declspec(dllimport)</span>定义与否都可以正常使用。但我们也没有遇到变量不能正常使用呀。 那好，我们改一下<span lang="EN-US">SimpleDLLClass,</span>把它的<span lang="EN-US">m_nValue</span>改成<span lang="EN-US">static,</span>然后在<span lang="EN-US">cpp</span>文件中加一行<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-align: left; line-height: 150%; margin: 3.15pt 0cm; word-break: break-all; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="line-height: 150%; font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">int SimpleDLLClass::m_nValue=0;</span><span style="line-height: 150%; font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">如果你不知道为什么要加这一行，那就回去看看<span lang="EN-US">C++</span>的基础。 改完之后，再去<span lang="EN-US">LINK</span>一下，你的<span lang="EN-US">APP</span>，看结果如何， 结果是<span lang="EN-US">LINK</span>告诉你找不到这个<span lang="EN-US">m_nValue</span>。明明已经定义了，为什么又没有了？？ 肯定是因为我把<span lang="EN-US">m_nValue</span>定义为<span lang="EN-US">static</span>的原因。但如果我一定要使用<span lang="EN-US">Singleton</span>的<span lang="EN-US">Design Pattern</span>的话，那这个类肯定是要有一个静态成员，每次<span lang="EN-US">LINK</span>都没有，那不是完了？如果你有<span lang="EN-US">Platform SDK</span>，用里面的<span lang="EN-US">Depend</span>程序看一下，<span lang="EN-US">DLL</span>中又的确是有这个<span lang="EN-US">m_nValue</span>导出的呀。<span lang="EN-US"><br /></span>再回去看看我引用<span lang="EN-US">MSDN</span>的那段话的最后一句。 那我们再改一下<span lang="EN-US">SimpleDLLClass.h</span>，把那段改成下面的样子<span lang="EN-US">:<o:p></o:p></span></span></p><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">#ifdef SIMPLEDLL_EXPORT#define DLL_EXPORT __declspec(dllexport)#else#define DLL_EXPORT __declspec(dllimport)#endif</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">再<span lang="EN-US">LINK</span>，一切正常。原来<span lang="EN-US">dllimport</span>是为了更好的处理类中的静态成员变量的，如果没有静态成员变量，那么这个<span lang="EN-US">__declspec(dllimport)</span>无所谓。 </span><img src ="http://www.cppblog.com/weining45/aggbug/177600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:20 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>__declspec(dllexport)</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177599.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:19:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177599.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177599.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177599.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177599.html</trackback:ping><description><![CDATA[<p style="text-indent: -18pt; margin: 0cm 0cm 6pt 39pt"><span style="font-family: '微软雅黑','sans-serif'">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: '微软雅黑','sans-serif'">&nbsp;__declspec(dllexport)</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">将一个函数声明为导出函数，就是说这个函数要被其他程序调用，作为DLL的一个对外函数接口。</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">通常它和extern &#8220;C&#8221;合用，形式如下</span></p>
<p style="text-indent: 18pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">Extern &#8220;C&#8221;</span></p>
<p style="text-indent: 18pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">{</span></p>
<p style="text-indent: 36pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">_declspec(dllexport) RETURN_TYPE FUNCTION()</span></p>
<p style="text-indent: 36pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">{</span></p>
<p style="text-indent: 36pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">}</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">}</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">这是由于在制作DLL导出函数时，由于C++存在函数重载，因此_declspec(dllexport) FUNCTION(int,int)在DLL会被decorate，例如被decorate成为function_int_int，而且不同的编译器decorate的方法不同，造成了在用GetProcaddress取得FUNCTION地址时的不便，使用extern &#8220;C&#8221;时，上述的decorate不会发生，因为C没有函数重载，如此一来被extern &#8220;C&#8221;修饰的函数就不具备重载能力。</span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><strong><span style="font-family: '微软雅黑','sans-serif'">2.&nbsp;MSDN</span></strong></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">在 32 位编译器版本中，可以使用__declspec(dllexport) 关键字从 DLL 导出数据、函数、类或类成员函数。</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">__declspec(dllexport)</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">将导出指令添加到对象文件(即obj文件)，若要导出函数，__declspec(dllexport)关键字必须出现在调用约定关键字的左边（如果指定了关键字）。例如： </span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">__declspec(dllexport) void __cdecl Function1(void); </span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">若要导出类中的所有公共数据成员和成员函数，关键字必须出现在类名的左边，如下所示：</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">class __declspec(dllexport) CExampleExport : public CObject { ... class definition ... };</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">生成 DLL 时，通常创建一个包含正在导出的函数原型和/或类的头文件，并将__declspec(dllexport)添加到头文件中的声明。若要提高代码的可读性，请为__declspec(dllexport)定义一个宏，并对正在导出的每个符号使用该宏：#define DllExport&nbsp;&nbsp; __declspec( dllexport ) </span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt"><strong><span style="font-family: '微软雅黑','sans-serif'">3.&nbsp;__declspec(dllexport)</span></strong><strong><span style="font-family: '微软雅黑','sans-serif'">与.def</span></strong></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">模块定义（.def）文件是包含一个或多个描述各种 DLL 属性的 Module 语句的文本文件。</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">1</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">、二者的目的都是将公共符号导入到应用程序中或从 DLL 导出函数。</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">2</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">、添加 __declspec(dllexport)是为了提供不使用.def文件从 .EXE 或 .DLL 导出函数的简单方法。</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">3</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">、如果不使用 __declspec (dllimport) 或 __declspec(dllexport) 导出 DLL 函数，则 DLL 需要.def文件。</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">4</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">、并不是任何时候选择添加 __declspec(dllexport)而放弃.def的方式都是好的。如果DLL是提供给VC++用户使用的，只需要把编译DLL时产生的.lib提供给用户，它可以很轻松地调用你的DLL。但是如果DLL是供VB、PB、Delphi用户使用的，那么会产生一个小麻烦。因为VC++对于__declspec(dllexport) 声明的函数会进行名称转换，如下面的函数： </span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">__declspec(dllexport) int __stdcall IsWinNT() </span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">会转换为IsWinNT@0，这样你在VB中必须这样声明： </span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long </span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">@</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换，就要使用.def文件方式。</span></p><img src ="http://www.cppblog.com/weining45/aggbug/177599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:19 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DLL调用方法</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177598.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:18:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177598.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177598.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177598.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177598.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177598.html</trackback:ping><description><![CDATA[<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">调用<span lang="EN-US">DLL</span>，首先需要将<span lang="EN-US">DLL</span>文件映像到用户进程的地址空间中，然后才能进行函数调用，这个函数和进程内部一般函数的调用方法相同。<span lang="EN-US">Windows</span>提供了两种将<span lang="EN-US">DLL</span>映像到进程地址空间的方法：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: Tahoma" lang="EN-US">1. </span><span style="font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: Tahoma">隐式的加载时链接 <span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">这种方法需要<span lang="EN-US">DLL</span>工程经编译产生的<span lang="EN-US">LIB</span>文件，此文件中包含了<span lang="EN-US">DLL</span>允许应用程序调用的所有函数的列表，当链接器发现应用程序调用了<span lang="EN-US">LIB</span>文件列出的某个函数，就会在应用程序的可执行文件的文件映像中加入一些信息，这些信息指出了包含这个函数的<span lang="EN-US">DLL</span>文件的名字。当这个应用程序运行时，也就是它的可执行文件被操作系统产生映像文件时，系统会查看这个映像文件中关于<span lang="EN-US">DLL</span>的信息，然后将这个<span lang="EN-US">DLL</span>文件映像到进程的地址空间。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">系统通过<span lang="EN-US">DLL</span>文件的名称，试图加载这个文件到进程地址空间时，它寻找<span lang="EN-US">DLL </span>文件的路径按照先后顺序如下：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&#183;</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">程序运行时的目录，即可执行文件所在的目录；<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&#183;</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">当前程序工作目录<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&#183;</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">系统目录：对于<span lang="EN-US">Windows95/98</span>来说，可以调用<span lang="EN-US">GetSystemDirectory</span>函数来得到，对于<span lang="EN-US">WindowsNT/2000</span>来说，指的是<span lang="EN-US">32</span>位<span lang="EN-US">Windows</span>的系统目录，也可以调用<span lang="EN-US">GetSystemDirectory</span>函数来得到，得到的值为<span lang="EN-US">SYSTEM32</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&#183;Windows</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">目录<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&#183;</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">列在<span lang="EN-US">PATH</span>环境变量中的所有目录<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">VC</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">中加载<span lang="EN-US">DLL</span>的<span lang="EN-US">LIB</span>文件的方法有以下三种：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&#9312;LIB</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">文件直接加入到工程文件列表中<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">在<span lang="EN-US">VC</span>中打开<span lang="EN-US">File View</span>一页，选中工程名，单击鼠标右键，然后选中<span lang="EN-US">&#8220;Add Files to Project&#8221;</span>菜单，在弹出的文件对话框中选中要加入<span lang="EN-US">DLL</span>的<span lang="EN-US">LIB</span>文件即可。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&#9313;</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">设置工程的<span lang="EN-US"> Project Settings</span>来加载<span lang="EN-US">DLL</span>的<span lang="EN-US">LIB</span>文件<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">打开工程的<span lang="EN-US"> Project Settings</span>菜单，选中<span lang="EN-US">Link</span>，然后在<span lang="EN-US">Object/library modules</span>下的文本框中输入<span lang="EN-US">DLL</span>的<span lang="EN-US">LIB</span>文件。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&#9314;</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">通过程序代码的方式<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">加入预编译指令<span lang="EN-US">#pragma comment (lib,&#8221;*.lib&#8221;)</span>，这种方法优点是可以利用条件预编译指令链接不同版本的<span lang="EN-US">LIB</span>文件。因为，在<span lang="EN-US">Debug</span>方式下，产生的<span lang="EN-US">LIB</span>文件是<span lang="EN-US">Debug</span>版本，如<span lang="EN-US">Regd.lib</span>；在<span lang="EN-US">Release</span>方式下，产生的<span lang="EN-US">LIB</span>文件是<span lang="EN-US">Release</span>版本，如<span lang="EN-US">Regr.lib</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">当应用程序对<span lang="EN-US">DLL</span>的<span lang="EN-US">LIB</span>文件加载后，还需要把<span lang="EN-US">DLL</span>对应的头文件（<span lang="EN-US">*.h</span>）包含到其中，在这个头文件中给出了<span lang="EN-US">DLL</span>中定义的函数原型，然后声明。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 21pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: Tahoma" lang="EN-US">2 </span><span style="font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: Tahoma">显式的运行时链接<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">隐式链接虽然实现较简单，但除了必须的<span lang="EN-US">*.dll</span>文件外还需要<span lang="EN-US">DLL</span>的<span lang="EN-US">*.h</span>文件和<span lang="EN-US">*.lib</span>文件，在那些只提供<span lang="EN-US">*.dll</span>文件的场合就无法使用，而只能采用显式链接的方式。这种方式通过调用<span lang="EN-US">API</span>函数来完成对<span lang="EN-US">DLL</span>的加载与卸载，其能更加有效地使用内存，在编写大型应用程序时往往采用此方式。这种方法编程具体实现步骤如下：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&#9312;</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">使用<span lang="EN-US">Windows API</span>函数<span lang="EN-US">Load Library</span>或者<span lang="EN-US">MFC</span>提供的<span lang="EN-US">AfxLoadLibrary</span>将<span lang="EN-US">DLL</span>模块映像到进程的内存空间，对<span lang="EN-US">DLL</span>模块进行动态加载。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">&#9313;</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">使用<span lang="EN-US">GetProcAddress</span>函数得到要调用<span lang="EN-US">DLL</span>中的函数的指针。<span lang="EN-US"><o:p></o:p></span></span></p><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">&#9314;</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">不用<span lang="EN-US">DLL</span>时，用<span lang="EN-US">Free Library</span>函数或者<span lang="EN-US">AfxFreeLibrary</span>函数从进程的地址空间显式卸载<span lang="EN-US">DLL</span>。</span><img src ="http://www.cppblog.com/weining45/aggbug/177598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:18 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++编译过程</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177592.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:10:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177592.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177592.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177592.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177592.html</trackback:ping><description><![CDATA[<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">标准<span lang="EN-US">C++</span>将编译过程定义为<span lang="EN-US">9</span>个阶段：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 6pt 39pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 0; mso-para-margin-top: 0cm; mso-para-margin-right: 0cm; mso-para-margin-left: 39.0pt; mso-list: l0 level1 lfo1" class="MsoListParagraph"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 微软雅黑" lang="EN-US"><span style="mso-list: Ignore">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">字符映射：文件中的物理源字符被映射到源字符集中，其中包括三字符运算符的替换、控制字符（行尾的回车换行）的替换。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 6pt 39pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 0; mso-para-margin-top: 0cm; mso-para-margin-right: 0cm; mso-para-margin-left: 39.0pt; mso-list: l0 level1 lfo1" class="MsoListParagraph"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 微软雅黑" lang="EN-US"><span style="mso-list: Ignore">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">行合并：以反斜杠结束的行和它接下来的行合并<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 6pt 39pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 0; mso-para-margin-top: 0cm; mso-para-margin-right: 0cm; mso-para-margin-left: 39.0pt; mso-list: l0 level1 lfo1" class="MsoListParagraph"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 微软雅黑" lang="EN-US"><span style="mso-list: Ignore">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">标记化：每一条注释被一个单独的空字符所替换，源代码被分析成预处理标记<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 6pt 39pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 0; mso-para-margin-top: 0cm; mso-para-margin-right: 0cm; mso-para-margin-left: 39.0pt; mso-list: l0 level1 lfo1" class="MsoListParagraph"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 微软雅黑" lang="EN-US"><span style="mso-list: Ignore">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">预处理：调用预处理指令并扩展宏，使用<span lang="EN-US">include</span>指令包含的文件，重复<span lang="EN-US">1</span>到<span lang="EN-US">4</span>阶段。<span lang="EN-US">1</span>到<span lang="EN-US">4</span>阶段统称为预处理阶段。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 6pt 39pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 0; mso-para-margin-top: 0cm; mso-para-margin-right: 0cm; mso-para-margin-left: 39.0pt; mso-list: l0 level1 lfo1" class="MsoListParagraph"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 微软雅黑" lang="EN-US"><span style="mso-list: Ignore">5.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">字符集映射：源字符集成员、转义序列被转换成等价的执行字符集成员<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 6pt 39pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 0; mso-para-margin-top: 0cm; mso-para-margin-right: 0cm; mso-para-margin-left: 39.0pt; mso-list: l0 level1 lfo1" class="MsoListParagraph"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 微软雅黑" lang="EN-US"><span style="mso-list: Ignore">6.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">字符串连接：将相邻的字符串进行连接<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 6pt 39pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 0; mso-para-margin-top: 0cm; mso-para-margin-right: 0cm; mso-para-margin-left: 39.0pt; mso-list: l0 level1 lfo1" class="MsoListParagraph"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 微软雅黑" lang="EN-US"><span style="mso-list: Ignore">7.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">翻译：将写好的<span lang="EN-US">C++</span>程序代码进行语法和语义分析编译，并翻译成可执行的目标代码<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 6pt 39pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 0; mso-para-margin-top: 0cm; mso-para-margin-right: 0cm; mso-para-margin-left: 39.0pt; mso-list: l0 level1 lfo1" class="MsoListParagraph"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 微软雅黑" lang="EN-US"><span style="mso-list: Ignore">8.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">处理模板：此时会调用库函数<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: -18pt; margin: 0cm 0cm 6pt 39pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 0; mso-para-margin-top: 0cm; mso-para-margin-right: 0cm; mso-para-margin-left: 39.0pt; mso-list: l0 level1 lfo1" class="MsoListParagraph"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 微软雅黑" lang="EN-US"><span style="mso-list: Ignore">9.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">链接：把所有编译好的单元全部链接为一个整体文件，其实这一步可以比作是一个<span lang="EN-US">&#8220;</span>连线的过程。<span lang="EN-US">&#8221;</span>链接时最重要的是检查全局空间里面是不是有重复定义或者缺失定义。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 0cm; margin: 0cm 0cm 6pt 39pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 0; mso-para-margin-top: 0cm; mso-para-margin-right: 0cm; mso-para-margin-left: 39.0pt" class="MsoListParagraph"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">链接包括三个过程：预编译，编译，链接<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 0cm; margin: 0cm 0cm 6pt 39pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 0; mso-para-margin-top: 0cm; mso-para-margin-right: 0cm; mso-para-margin-left: 39.0pt" class="MsoListParagraph"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">编译阶段分两步：检查函数或者变量是否存在它们的声明；检查语句是否符合<span lang="EN-US">C++</span>语法<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 0cm; margin: 0cm 0cm 6pt 39pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 0; mso-para-margin-top: 0cm; mso-para-margin-right: 0cm; mso-para-margin-left: 39.0pt" class="MsoListParagraph"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">预编译阶段粗略的认为就是<span lang="EN-US">&#8220;</span>宏展开<span lang="EN-US">&#8221;</span>，即建立名与体的对等关系，以便在编译阶段进行替换。<span lang="EN-US"><o:p></o:p></span></span></p>
<p>&nbsp;&nbsp;</p>
<p style="text-indent: 0cm; margin: 0cm 0cm 6pt 39pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 0; mso-para-margin-top: 0cm; mso-para-margin-right: 0cm; mso-para-margin-left: 39.0pt" class="MsoListParagraph"><span style="font-family: '微软雅黑','sans-serif'; color: #6d6d6d; font-size: 9pt; mso-bidi-font-family: Tahoma">编译：将源代码转换为机器可认识代码的过程。编译程序读取源程序（字符流），对之进行词法和语法的分析，将高级语言指令转换为功能等效的汇编代码，再由汇编程序转换为机器语言，并且按照操作系统对可执行文件格式的要求链接生成可执行程序<span lang="EN-US"><o:p></o:p></span></span></p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/weining45/aggbug/177592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:10 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Do { } while(0);</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177590.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:08:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177590.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177590.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177590.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177590.html</trackback:ping><description><![CDATA[<p><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">将<span lang="EN-US">{}</span>内的语句作为一个整体，在定义宏的时候特别关键；</span></p>
<p><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">另外，使用该结构可以避免使用<span lang="EN-US">goto</span>语句，如果在<span lang="EN-US">{}</span>内进行多项判断，只要一项判断错误，则跳过之后的其他判断，则使用该结构直接跳出，而不用使用<span lang="EN-US">goto</span>语句</span>。</p><img src ="http://www.cppblog.com/weining45/aggbug/177590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:08 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>结构体</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177589.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:07:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177589.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177589.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177589.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177589.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177589.html</trackback:ping><description><![CDATA[<p style="text-indent: -18pt; margin: 0cm 0cm 6pt 39pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 0; mso-para-margin-top: 0cm; mso-para-margin-right: 0cm; mso-para-margin-left: 39.0pt; mso-list: l0 level1 lfo1" class="MsoListParagraph"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: 微软雅黑" lang="EN-US"><span style="mso-list: Ignore"><span style="font: 7pt 'Times New Roman'">&nbsp;</span></span></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">在<span lang="EN-US">C</span>语言中定义结构体的语法如下：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">struct student<o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">{<o:p></o:p></span></p>
<p style="text-indent: 31.5pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 3.5" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">string name;<o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">};<o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">接下来，定义该结构体的一个<span lang="EN-US">s</span>变量的语法如下：<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">struct student s;<o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">即在定义结构体变量时需要带上<span lang="EN-US">struct</span>关键字。有一种方法可以使得在定义结构体变量时不带<span lang="EN-US">struct</span>关键字：使用类型别名。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">typedef struct <em style="mso-bidi-font-style: normal">student</em><span style="mso-tab-count: 1">&nbsp;&nbsp; </span><o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">{<o:p></o:p></span></p>
<p style="text-indent: 31.5pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 3.5" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">string name;<o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">}stu;<o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">stu s;<o:p></o:p></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">在上面的结构体定义中也可以省略结构体名称<span lang="EN-US">student</span>，因为定义别名为的就是简化定义语句，后面不会使用该结构体的原名，所以不明确写出<span lang="EN-US">student</span>也可以。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US">C++</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma">对结构体类型进行了调整：<span lang="EN-US">C++</span>中的结构体和类除了默认访问级别不同外，没有其他区别。所以，在定义结构体类型时，即使前面没有<span lang="EN-US">typedef</span>，在定义结构体变量时也不需要带有<span lang="EN-US">struct</span>关键字。<span lang="EN-US"><o:p></o:p></span></span></p><img src ="http://www.cppblog.com/weining45/aggbug/177589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:07 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>静态成员变量</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177588.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:02:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177588.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177588.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177588.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177588.html</trackback:ping><description><![CDATA[<div>C++静态成员变量需要在类外进行声明</div><img src ="http://www.cppblog.com/weining45/aggbug/177588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:02 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符类型操作</title><link>http://www.cppblog.com/weining45/archive/2012/06/05/177587.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 05 Jun 2012 01:01:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/06/05/177587.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/177587.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/06/05/177587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/177587.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/177587.html</trackback:ping><description><![CDATA[<div>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">LPSTR</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">：即 char *，指向以'\0'结尾的8位（单字节）ANSI字符数组指针 </span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">LPWSTR</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">：即wchar_t *，指向'\0'结尾的16位（双字节）Unicode字符数组指针</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">LPCSTR</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">：即const char * </span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">LPCWSTR</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">：即const wchar_t *</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">LPTSTR</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">：LPSTR、LPWSTR两者二选一，取决于是否宏定义了UNICODE或ANSI </span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">LPCTSTR</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">： LPCSTR、LPCWSTR两者二选一，取决于是否宏定义了UNICODE或ANSI，</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt"></span>&nbsp;</p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">1.string </span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">转 CString</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString.format(&#8221;%s&#8221;, string.c_str());</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">2.char </span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">转 CString</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString.format(&#8221;%s&#8221;, char*);</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">3.char to string</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp; string s(char *);</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">4.string </span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">转 char *</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp; char *p = string.c_str();</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">5.CString </span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">转 string</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string s(CString.GetBuffer());</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">6.string -&gt; CString</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString.format(&#8221;%s&#8221;, string.c_str());</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">用c_str()确实比data()要好.</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">7.CString -&gt; string</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string s(CString.GetBuffer());</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetBuffer()</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">8.</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">有三个函数可以将字符串的内容转换为字符数组和C&#8212;string</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.data(),</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">返回没有&#8221;\0&#8220;的字符串数组</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2,c_str()</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">，返回有&#8221;\0&#8220;的字符串数组</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">，copy()</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">9.</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">将字符转换为整数，可以使用atoi、_atoi64或atol。</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">10.</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">将数字转换为CString变量，可以使用CString的Format函数</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString s;</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 64;</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.Format(&#8221;%d&#8221;, i)</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Format</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">函数的功能很强，值得你研究一下。</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">11.cstring TO char *</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; charpoint=strtest.GetBuffer(strtest.GetLength());</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">12.CString</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">转换 char[100]</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char a[100];</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString str(&#8221;aaaaaa&#8221;);</span></p>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strncpy(a,(LPCTSTR)str,sizeof(a));</span></p></div><img src ="http://www.cppblog.com/weining45/aggbug/177587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-06-05 09:01 <a href="http://www.cppblog.com/weining45/archive/2012/06/05/177587.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC6升级到VS2010</title><link>http://www.cppblog.com/weining45/archive/2012/05/08/173978.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Tue, 08 May 2012 03:58:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/05/08/173978.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/173978.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/05/08/173978.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/173978.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/173978.html</trackback:ping><description><![CDATA[<dl>
<dt><span style="font-family: Arial; font-size: 10pt">
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt" align="justify"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">VS2005</span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt">之后的IDE封装了MSXML2，项目中使用了第三方控件，为了兼容性，对于使用的MSSML2中的变量名称前均加上域操作符MSXML2::</span></p></span>
<dt><span style="font-family: Arial; font-size: 10pt">
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt" align="justify"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt"></span>即在程序头部进行如下定义：</span><span style="font-family: Arial; font-size: 10pt"></span></p>
<dt>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt" align="justify"><span style="font-family: Arial; font-size: 10pt">#define IXMLDOMNodeListPtr MSXML2::IXMLDOMNodeListPtr</span></p>
<dt>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt" align="justify"><span style="font-family: Arial; font-size: 10pt"></span><span style="font-family: Arial; font-size: 10pt">#define IXMLDOMNodePtr MSXML2::IXMLDOMNodePtr</span></p>
<dt>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt" align="justify"><span style="font-family: Arial; font-size: 10pt"></span><span style="font-family: Arial; font-size: 10pt">#define IXMLDOMNamedNodeMapPtr MSXML2::IXMLDOMNamedNodeMapPtr</span></p>
<dt>
<p style="text-indent: 18pt; margin: 0cm 0cm 6pt" align="justify"><span style="font-family: Arial; font-size: 10pt"></span><span style="font-family: Arial; font-size: 10pt">#define DOMDocument40 MSXML2::DOMDocument40 </span></p></dt></dl><img src ="http://www.cppblog.com/weining45/aggbug/173978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-05-08 11:58 <a href="http://www.cppblog.com/weining45/archive/2012/05/08/173978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>#pragma comment</title><link>http://www.cppblog.com/weining45/archive/2012/05/07/173927.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Mon, 07 May 2012 11:14:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/05/07/173927.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/173927.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/05/07/173927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/173927.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/173927.html</trackback:ping><description><![CDATA[#pragma comment<img src ="http://www.cppblog.com/weining45/aggbug/173927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-05-07 19:14 <a href="http://www.cppblog.com/weining45/archive/2012/05/07/173927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC6中不标准成分</title><link>http://www.cppblog.com/weining45/archive/2012/05/07/173921.html</link><dc:creator>Winnie</dc:creator><author>Winnie</author><pubDate>Mon, 07 May 2012 10:27:00 GMT</pubDate><guid>http://www.cppblog.com/weining45/archive/2012/05/07/173921.html</guid><wfw:comment>http://www.cppblog.com/weining45/comments/173921.html</wfw:comment><comments>http://www.cppblog.com/weining45/archive/2012/05/07/173921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/weining45/comments/commentRss/173921.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/weining45/services/trackbacks/173921.html</trackback:ping><description><![CDATA[<dl>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; font-size: 10pt; mso-bidi-font-family: Tahoma" lang="EN-US">根据C++的标准，在for语句中定义的变量，其作用域仅限于for语句内，但是VC6.0中的for语句不符合标准。</span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; color: #808000; font-size: 10pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i&lt;5; ++i)</span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; color: #808000; font-size: 10pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; color: #808000; font-size: 10pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; color: #808000; font-size: 10pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//i在此处仍然有效</span>&nbsp;</div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; font-size: 10pt; mso-bidi-font-family: Tahoma" lang="EN-US">可以通过如下的宏定义去掉VC6中for的不符合标准的成分：</span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; color: #808000; font-size: 10pt; mso-bidi-font-family: Tahoma" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define for if (0); else for<span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"></span></span>&nbsp;</div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="font-family: Arial; font-size: 10pt; mso-tab-count: 3">因为加了上述的宏定义之后，前面的for语句展开为：</span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="font-family: Arial; color: #808000; font-size: 10pt; mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(0)</span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="font-family: Arial; color: #808000; font-size: 10pt; mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;</span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="font-family: Arial; color: #808000; font-size: 10pt; mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else</span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="font-family: Arial; color: #808000; font-size: 10pt; mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i&lt;5; ++i)</span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="font-family: Arial; color: #808000; font-size: 10pt; mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="font-family: Arial; color: #808000; font-size: 10pt; mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="font-family: Arial; color: #808000; font-size: 10pt; mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//此处已经超出else的作用域范围，在else语句中定义的i无效</span></span>&nbsp;</div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #000000; font-size: 10pt">有人会说，那定义为如下定义是不是也可以呢？</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define for if(1) for</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #000000; font-size: 10pt">我们使用这个宏定义展开前面的for语句看看：</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(1)</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i&lt;5; ++i)</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//此处i也同样超出了if语句的作用域，也将无效</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #000000; font-size: 10pt">但是，如果for语句是在if语句里的呢，例如：</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(a&gt;b)</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i&lt;5; ++i)</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dosomething(i);</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doanotherthing();//</span><span style="font-family: Arial; color: #808000; font-size: 10pt"><strong>希望在a&lt;=b时执行</strong></span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #000000; font-size: 10pt">展开将得到：</span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="color: #808000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: Arial; color: #808000; font-size: 10pt">if(a&gt;b) </span></font></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt; mso-bidi-font-family: Tahoma" lang="EN-US"><span style="mso-tab-count: 3"><font color="#808000"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(1)</div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i&lt;5; ++i)</span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dosomething(i);</span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else</span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doanotherthing();//</span><span style="font-family: Arial; color: #808000; font-size: 10pt"><strong>实际在a&gt;b时也执行了</strong></span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt" align="left"><span style="font-family: '微软雅黑','sans-serif'; font-size: 9pt"><span style="font-family: Arial; color: #808000; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; color: #000000; font-size: 10pt">另外，如果程序中错误的出现</span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i &lt; 5; ++i)</span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else</span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; color: #000000; font-size: 10pt">通过上述的宏定义展开，也将无错。</span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; color: #000000; font-size: 10pt">当然前一个问题可以通过好的编码习惯避免：给所有的if，else语句都加大括号，即使只有一条语句；而后一个问题可以通过仔细检查而避免。但是介于#define for if(1) for宏定义存在的隐患，</span></div></dt>
<dt>
<div style="text-indent: 18pt; margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd; mso-char-indent-count: 2.0" class="MsoNormal" align="left"><span style="font-family: Arial; color: #000000; font-size: 10pt">还是使用#define for if (0); else for最好。</span></span></font></span></span></div></dt></dl><img src ="http://www.cppblog.com/weining45/aggbug/173921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/weining45/" target="_blank">Winnie</a> 2012-05-07 18:27 <a href="http://www.cppblog.com/weining45/archive/2012/05/07/173921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>