﻿<?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++博客-Small place-文章分类-Windows IDE</title><link>http://www.cppblog.com/fenglinuestc/category/6969.html</link><description>Things will not always be bad,enjoy it.</description><language>zh-cn</language><lastBuildDate>Thu, 20 May 2010 09:00:20 GMT</lastBuildDate><pubDate>Thu, 20 May 2010 09:00:20 GMT</pubDate><ttl>60</ttl><item><title>调用约定(转)</title><link>http://www.cppblog.com/fenglinuestc/articles/56326.html</link><dc:creator>Lexili</dc:creator><author>Lexili</author><pubDate>Wed, 16 Jul 2008 09:58:00 GMT</pubDate><guid>http://www.cppblog.com/fenglinuestc/articles/56326.html</guid><wfw:comment>http://www.cppblog.com/fenglinuestc/comments/56326.html</wfw:comment><comments>http://www.cppblog.com/fenglinuestc/articles/56326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fenglinuestc/comments/commentRss/56326.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fenglinuestc/services/trackbacks/56326.html</trackback:ping><description><![CDATA[<p>前段时间写个DLL给这个东西弄郁闷了。<br>转自MSDN..http://www.microsoft.com/china/community/program/originalarticles/...(这个我也很无语)<br>1、__stdcall调用约定相当于16位动态库中经常使用的PASCAL调用约定。在32位的VC++5.0中<br>PASCAL调用约定不再被支持（实际上它已被定义为__stdcall。除了__pascal外，__fortran和<br>__syscall也不被支持），取而代之的是__stdcall调用约定。两者实质上是一致的，即函数的参数自<br>右向左通过栈传递，被调用的函数在返回前清理传送参数的内存栈，但不同的是函数名的修饰部分<br>（关于函数名的修饰部分在后面将详细说明）。<br>_stdcall是Pascal程序的缺省调用方式，通常用于Win32 Api中，函数采用从右到左的压栈方式，自<br>己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀，在函数名后加上"@"和参数<br>的字节数。<br>2、C调用约定（即用__cdecl关键字说明）按从右至左的顺序压参数入栈，由调用者把参数弹出栈。<br>对于传送参数的内存栈是由调用者来维护的（正因为如此，实现可变参数的函数只能使用该调用约<br>定）。另外，在函数名修饰约定方面也有所不同。<br>_cdecl是C和C＋＋程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码，所以产生的<br>可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函<br>数名前面加上下划线前缀。是MFC缺省调用约定。<br>3、__fastcall调用约定是"人"如其名，它的主要特点就是快，因为它是通过寄存器来传送参数的（实<br>际上，它用ECX和EDX传送前两个双字（DWORD）或更小的参数，剩下的参数仍旧自右向左压栈传<br>送，被调用的函数在返回前清理传送参数的内存栈），在函数名修饰约定方面，它和前两者均不同。<br>_fastcall方式的函数采用寄存器传递参数，VC将函数编译后会在函数名前面加上"@"前缀，在函数<br>名后加上"@"和参数的字节数。<br>4、thiscall仅仅应用于"C++"成员函数。this指针存放于CX寄存器，参数从右到左压。thiscall不是<br>关键词，因此不能被程序员指定。<br>5、naked call采用1-4的调用约定时，如果必要的话，进入函数时编译器会产生代码来保存ESI，<br>EDI，EBX，EBP寄存器，退出函数时则产生代码恢复这些寄存器的内容。<br>naked call不产生这样的代码。naked call不是类型修饰符，故必须和_declspec共同使用。<br>关键字 __stdcall、__cdecl和__fastcall可以直接加在要输出的函数前，也可以在编译环境的<br>Setting...\C/C++ \Code Generation项选择。当加在输出函数前的关键字与编译环境中的选择不<br>同时，直接加在输出函数前的关键字有效。它们对应的命令行参数分别为/Gz、/Gd和/Gr。缺省状态<br>为/Gd，即__cdecl。<br>要完全模仿PASCAL调用约定首先必须使用__stdcall调用约定，至于函数名修饰约定，可以通过其它<br>方法模仿。还有一个值得一提的是WINAPI宏，Windows.h支持该宏，它可以将出函数翻译成适当的<br>调用约定，在WIN32中，它被定义为__stdcall。使用WINAPI宏可以创建自己的APIs。<br>2)名字修饰约定<br>1、修饰名(Decoration name)<br>"C"或者"C++"函数在内部（编译和链接）通过修饰名识别。修饰名是编译器在编译函数定义或者原<br>型时生成的字符串。有些情况下使用函数的修饰名是必要的，如在模块定义文件里头指定输出"C++"<br>重载函数、构造函数、析构函数，又如在汇编代码里调<br>用"C""或"C++"函数等。<br>修饰名由函数名、类名、调用约定、返回类型、参数等共同决定。<br>2、名字修饰约定随调用约定和编译种类(C或C++)的不同而变化。函数名修饰约定随编译种类和调<br>用约定的不同而不同，下面分别说明。<br>a、C编译时函数名修饰约定规则：<br>__stdcall调用约定在输出函数名前加上一个下划线前缀，后面加上一个"@"符号和其参数的字节数，<br>格式为<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#102;&#117;&#110;&#99;&#116;&#105;&#111;&#110;&#110;&#97;&#109;&#101;&#64;&#110;&#117;&#109;&#98;&#101;&#114;">_functionname@number</a>。<br>__cdecl调用约定仅在输出函数名前加上一个下划线前缀，格式为_functionname。<br>__fastcall调用约定在输出函数名前加上一个"@"符号，后面也是一个"@"符号和其参数的字节数，<br>格式为@functionname@number。<br>它们均不改变输出函数名中的字符大小写，这和PASCAL调用约定不同，PASCAL约定输出的函数名<br>无任何修饰且全部大写。<br>b、C++编译时函数名修饰约定规则：<br>__stdcall调用约定：<br>1、以"?"标识函数名的开始，后跟函数名；<br>2、函数名后面以"@@YG"标识参数表的开始，后跟参数表；<br>3、参数表以代号表示：<br>X--void ，<br>D--char，<br>E--unsigned char，<br>F--short，<br>H--int，<br>I--unsigned int，<br>J--long，<br>K--unsigned long，<br>M--float，<br>N--double，<br>_N--bool，<br>....<br>PA--表示指针，后面的代号表明指针类型，如果相同类型的指针连续出现，以"0"代替，一个"0"代表<br>一次重复；<br>4、参数表的第一项为该函数的返回值类型，其后依次为参数的数据类型,指针标识在其所指数据类型<br>前；<br>5、参数表后以"@Z"标识整个名字的结束，如果该函数无参数，则以"Z"标识结束。<br>其格式为"<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#63;&#102;&#117;&#110;&#99;&#116;&#105;&#111;&#110;&#110;&#97;&#109;&#101;&#64;&#64;&#89;&#71;&#42;&#42;&#42;&#42;&#42;&#64;&#90;">?functionname@@YG*****@Z</a>"或"<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#63;&#102;&#117;&#110;&#99;&#116;&#105;&#111;&#110;&#110;&#97;&#109;&#101;&#64;&#64;&#89;&#71;&#42;&#88;&#90;">?functionname@@YG*XZ</a>"，例如<br>int Test1（char *var1,unsigned long）<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#45;&#45;&#45;&#45;&#45;&#8220;&#63;&#84;&#101;&#115;&#116;&#49;&#64;&#64;&#89;&#71;&#72;&#80;&#65;&#68;&#75;&#64;&#90;">-----&#8220;?Test1@@YGHPADK@Z</a>&#8221;<br>void Test2（） <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#45;&#45;&#45;&#45;&#45;&#8220;&#63;&#84;&#101;&#115;&#116;&#50;&#64;&#64;&#89;&#71;&#88;&#88;&#90;">-----&#8220;?Test2@@YGXXZ</a>&#8221;<br>__cdecl调用约定：<br>规则同上面的_stdcall调用约定，只是参数表的开始标识由上面的"@@YG"变为"@@YA"。<br>__fastcall调用约定：<br>规则同上面的_stdcall调用约定，只是参数表的开始标识由上面的"@@YG"变为"@@YI"。<br>VC++对函数的省缺声明是"__cedcl",将只能被C/C++调用.</p>
<img src ="http://www.cppblog.com/fenglinuestc/aggbug/56326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fenglinuestc/" target="_blank">Lexili</a> 2008-07-16 17:58 <a href="http://www.cppblog.com/fenglinuestc/articles/56326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编译、连接出错解决笔记</title><link>http://www.cppblog.com/fenglinuestc/articles/49001.html</link><dc:creator>Lexili</dc:creator><author>Lexili</author><pubDate>Tue, 06 May 2008 06:24:00 GMT</pubDate><guid>http://www.cppblog.com/fenglinuestc/articles/49001.html</guid><wfw:comment>http://www.cppblog.com/fenglinuestc/comments/49001.html</wfw:comment><comments>http://www.cppblog.com/fenglinuestc/articles/49001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fenglinuestc/comments/commentRss/49001.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fenglinuestc/services/trackbacks/49001.html</trackback:ping><description><![CDATA[当然有MSDN会对这些错误给出解释，但是要真正解决还是要记下来的。<br>1.LNK2001:<br>(vs2005)<br>a.无法解析外部符号 __security_cookie 'XXXX'。<br>解决方法：选择&#8220;项目&#8221;-&gt;&#8220;属性&#8221;-&gt;&#8220;C/C++&#8221;-&gt;&#8220;代码生成&#8221;-&gt;&#8220;缓冲区安全检查&#8221;，设为&#8220;否&#8221;（当然这不是最好的方法，最实在的解决方案应该是重新分析代码-_-）<br>(vc6.0)<br>a.msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#95;&#87;&#105;&#110;&#77;&#97;&#105;&#110;&#64;&#49;&#54;">_WinMain@16</a><br>Debug/XXXXX.exe : fatal error LNK1120: 1 unresolved externals<br>使用Unicode库的时候没有更改入口点,在Link-&gt;Output中把入口点改为Unicode版本:wWinMainCRTStartup<br><br>2.LNK2019:<br>a.很可能是没有包含相应的.h文件，如果是多个项目间的连接很可能是没有设置项目的依赖项（这个在VS2005里边经常出现）。<br>b.在写dll的时候经常出现，检查调用约定等可以解决。<br>添加中....<br>&nbsp;3.LNK2015:<br>&nbsp;出现情况：<br>a.函数或变量在两个不同的库中定义,而且是弱定义，这个基本上无解的。 <br>b.函数没有实现的实体，这个最简单了，有代码的加代码，无代码加库，一切OK。
<img src ="http://www.cppblog.com/fenglinuestc/aggbug/49001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fenglinuestc/" target="_blank">Lexili</a> 2008-05-06 14:24 <a href="http://www.cppblog.com/fenglinuestc/articles/49001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)VC++编译器选项</title><link>http://www.cppblog.com/fenglinuestc/articles/48311.html</link><dc:creator>Lexili</dc:creator><author>Lexili</author><pubDate>Mon, 28 Apr 2008 02:41:00 GMT</pubDate><guid>http://www.cppblog.com/fenglinuestc/articles/48311.html</guid><wfw:comment>http://www.cppblog.com/fenglinuestc/comments/48311.html</wfw:comment><comments>http://www.cppblog.com/fenglinuestc/articles/48311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fenglinuestc/comments/commentRss/48311.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fenglinuestc/services/trackbacks/48311.html</trackback:ping><description><![CDATA[<table class=dtTABLE cellSpacing=0>
    <tbody>
        <tr vAlign=top>
            <th width="29%">选项</th>
            <th width="71%">目的</th>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vctbsspecifyresponsefile.asp">@</a></td>
            <td width="71%">指定响应文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.help.asp">/?</a></td>
            <td width="71%">列出编译器选项</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vclrfaispecifymetadatadirectories.asp">/AI</a></td>
            <td width="71%">指定在解析传递到 #using 指令的文件引用时搜索的目录</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vclrfarchminimumcpuarchitecture.asp">/arch</a></td>
            <td width="71%">使用 SSE 或 SSE2 指令生成代码</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.c_uc.asp">/C</a></td>
            <td width="71%">在预处理期间保留注释</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.c_lc.asp">/c</a></td>
            <td width="71%">编译但不链接</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefeecomcompilation.asp">/clr</a></td>
            <td width="71%">启用 C++ 的托管扩展并产生在公共语言运行库上运行的输出文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.d.asp">/D</a></td>
            <td width="71%">定义常数和宏</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.e.asp">/E</a></td>
            <td width="71%">将预处理器输出复制到标准输出</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.eh.asp">/EH</a></td>
            <td width="71%">指定异常处理模型</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.ep.asp">/EP</a></td>
            <td width="71%">将预处理器输出复制到标准输出</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.f.asp">/F</a> </td>
            <td width="71%">设置堆栈大小</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fa.asp">/FA</a></td>
            <td width="71%">创建列表文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fa.asp">/Fa</a></td>
            <td width="71%">设置列表文件名</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fd.asp">/Fd</a></td>
            <td width="71%">重命名程序数据库文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fe.asp">/Fe</a></td>
            <td width="71%">重命名可执行文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fi.asp">/FI</a></td>
            <td width="71%">预处理指定的包含文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fm.asp">/Fm</a></td>
            <td width="71%">创建映射文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fo.asp">/Fo</a></td>
            <td width="71%">创建对象文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fp.asp">/Fp</a></td>
            <td width="71%">指定预编译头文件名</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fr.2c_2f.fr.asp">/FR</a><br><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.fr.2c_2f.fr.asp">/Fr</a></td>
            <td width="71%">生成浏览器文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vclrffunameforcedusingfile.asp">/FU</a></td>
            <td width="71%">强制使用文件名，就像它已被传递到 #using 指令一样</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefFxMergeInjectedCode.asp">/Fx</a></td>
            <td width="71%">将插入的代码与源文件合并</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.g.asp">/G3</a></td>
            <td width="71%">优化代码以优选 386 处理器。在 Visual C++ 5.0 中已经停用，编译器将忽略此选项</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.g.asp">/G4</a></td>
            <td width="71%">优化代码以优选 486 处理器。在 Visual C++ 5.0 中已经停用，编译器将忽略此选项</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.g.asp">/G5</a></td>
            <td width="71%">优化代码以优选 Pentium 处理器</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.g.asp">/G6</a></td>
            <td width="71%">优化代码以优选 Pentium Pro、Pentium II 和 Pentium III 处理器</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.g.asp">/G7</a></td>
            <td width="71%">针对 Pentium 4 或 Athlon 优化代码。</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.ga.asp">/GA</a></td>
            <td width="71%">优化 Windows 应用程序的代码</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.g.asp">/GB</a></td>
            <td width="71%">与 /G6 等效；将 _M_IX86 的值设置为 600</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gd.2c_2f.gr.2c_2f.gz.asp">/Gd</a></td>
            <td width="71%">使用 <strong>__cdecl</strong> 调用约定</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.ge.asp">/Ge</a></td>
            <td width="71%">激活堆栈探测</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gf.asp">/GF</a><br><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gf.asp">/Gf</a></td>
            <td width="71%">启用字符串池</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefghenable__pexithookfunction.asp">/GH</a></td>
            <td width="71%">调用挂钩函数 <strong>_pexit</strong></td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gh.asp">/Gh</a></td>
            <td width="71%">调用挂钩函数 <strong>_penter</strong></td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcgrfglwholeprogramoptimization.asp">/GL</a></td>
            <td width="71%">启用全程序优化</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gm_minimal.asp">/Gm</a></td>
            <td width="71%">启用最小重新生成</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gr_option.asp">/GR</a></td>
            <td width="71%">启用运行时类型信息 (RTTI)</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gd.2c_2f.gr.2c_2f.gz.asp">/Gr</a></td>
            <td width="71%">使用 <strong>__fastcall</strong> 调用约定</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vclrfgsbuffersecurity.asp">/GS</a></td>
            <td width="71%">缓冲区安全检查</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gs.asp">/Gs</a></td>
            <td width="71%">控制堆栈探测</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gt.asp">/GT</a></td>
            <td width="71%">支持使用静态线程本地存储区分配的数据的纤程安全</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gx.asp">/GX</a></td>
            <td width="71%">启用同步异常处理</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gy.asp">/Gy</a></td>
            <td width="71%">启用函数级链接</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefgz(catchrelease-builderrorsindebugbuild).asp">/GZ</a></td>
            <td width="71%">与 <a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefrtcruntimechecks.asp">/RTC1</a> 相同</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.gd.2c_2f.gr.2c_2f.gz.asp">/Gz</a></td>
            <td width="71%">使用 <strong>__stdcall</strong> 调用约定</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.h.asp">/H</a></td>
            <td width="71%">限制外部（公共）名称的长度</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.help.asp">/HELP</a></td>
            <td width="71%">列出编译器选项</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.i.asp">/I</a></td>
            <td width="71%">在目录中搜索包含文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.j.asp">/J</a></td>
            <td width="71%">更改默认的 <strong>char</strong> 类型</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp">/LD</a></td>
            <td width="71%">创建动态链接库</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp">/LDd</a></td>
            <td width="71%">创建调试动态链接库</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.link.asp">/link</a></td>
            <td width="71%">将指定的选项传递给 LINK</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp">/MD</a></td>
            <td width="71%">使用 MSVCRT.lib 创建多线程 DLL</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp">/MDd</a></td>
            <td width="71%">使用 MSVCRTD.lib 创建调试多线程 DLL</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp">/ML</a></td>
            <td width="71%">使用 LIBC.lib 创建单线程可执行文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp">/MLd</a></td>
            <td width="71%">使用 LIBCD.lib 创建调试单线程可执行文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp">/MT</a></td>
            <td width="71%">使用 LIBCMT.lib 创建多线程可执行文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.md.2c_2f.ml.2c_2f.mt.2c_2f.ld.asp">/MTd</a></td>
            <td width="71%">使用 LIBCMTD.lib 创建调试多线程可执行文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vclrfnologosuppressdisplayofbanner.asp">/nologo</a></td>
            <td width="71%">取消显示登录版权标志</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.o1.2c_2f.o2.asp">/O1</a></td>
            <td width="71%">创建小代码</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.o1.2c_2f.o2.asp">/O2</a></td>
            <td width="71%">创建快速代码</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.oa.2c_2f.ow.asp">/Oa</a></td>
            <td width="71%">假设没有别名</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.ob.asp">/Ob</a></td>
            <td width="71%">控制内联展开</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.od.asp">/Od</a></td>
            <td width="71%">禁用优化</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.og.asp">/Og</a></td>
            <td width="71%">使用全局优化</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.oi.asp">/Oi</a></td>
            <td width="71%">生成内部函数</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.op.asp">/Op</a></td>
            <td width="71%">改善浮点数一致性</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.os.asp">/Os</a></td>
            <td width="71%">代码大小优先</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.os.asp">/Ot</a></td>
            <td width="71%">代码速度优先</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.oa.2c_2f.ow.asp">/Ow</a></td>
            <td width="71%">假定在函数调用中使用别名</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.ox.asp">/Ox</a></td>
            <td width="71%">使用最大优化 (/Ob2gity /Gs)</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.oy.asp">/Oy</a></td>
            <td width="71%">省略框架指针</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.qi0f.asp">/QI0f</a></td>
            <td width="71%">执行 Pentium 0x0f 错误修复</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.qifdiv.asp">/QIfdiv</a></td>
            <td width="71%">执行 Pentium FDIV 错误修复</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefqifistsuppress_ftol.asp">/QIfist</a></td>
            <td width="71%">当需要从浮点类型转换为整型时取消 <strong>_ftol</strong></td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.p.asp">/P</a></td>
            <td width="71%">将预处理器输出写入文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefrtcruntimechecks.asp">/RTC</a></td>
            <td width="71%">启用运行时错误检查</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefshowincludes.asp">/showIncludes</a></td>
            <td width="71%">在编译期间显示包含文件的列表</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.tc.2c_2f.tp.asp">/Tc</a><br><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.tc.2c_2f.tp.asp">/TC</a></td>
            <td width="71%">指定 C 源文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.tc.2c_2f.tp.asp">/Tp</a><br><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.tc.2c_2f.tp.asp">/TP</a></td>
            <td width="71%">指定 C++ 源文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.u.2c_2f.u.asp">/U</a></td>
            <td width="71%">移除预定义宏</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.u.2c_2f.u.asp">/u</a></td>
            <td width="71%">移除所有的预定义宏</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.v.asp">/V</a></td>
            <td width="71%">设置版本字符串</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.vd.asp">/vd</a></td>
            <td width="71%">取消或启用隐藏的 vtordisp 类成员</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.vmb.2c_2f.vmg.asp">/vmb</a></td>
            <td width="71%">对指向成员的指针使用最佳的基</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.vmb.2c_2f.vmg.asp">/vmg</a></td>
            <td width="71%">对指向成员的指针使用完全一般性</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.vmm.2c_2f.vms.2c_2f.vmv.asp">/vmm</a></td>
            <td width="71%">声明多重继承</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.vmm.2c_2f.vms.2c_2f.vmv.asp">/vms</a></td>
            <td width="71%">声明单一继承</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.vmm.2c_2f.vms.2c_2f.vmv.asp">/vmv</a></td>
            <td width="71%">声明虚拟继承</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.w.2c_2f.w.asp">/W</a></td>
            <td width="71%">设置警告等级</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.w.2c_2f.w.asp">/w</a></td>
            <td width="71%">禁用所有警告</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.w.2c_2f.w.asp">/Wall</a></td>
            <td width="71%">启用所有警告，包括默认情况下禁用的警告</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefwlenableonelinediagnostics.asp">/WL</a></td>
            <td width="71%">在从命令行编译 C++ 源代码时启用错误信息和警告消息的单行诊断</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vchowwp64detect64bitportabilityproblems.asp">/Wp64</a></td>
            <td width="71%">检测 64 位可移植性问题</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.x.asp">/X</a></td>
            <td width="71%">忽略标准包含目录</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vclrfyignoreprecompiledheaderoptions.asp">/Y-</a></td>
            <td width="71%">忽略当前生成中的所有其他预编译头编译器选项</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.yc.asp">/Yc</a></td>
            <td width="71%">创建预编译头文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.yd.asp">/Yd</a></td>
            <td width="71%">将完整的调试信息放在所有对象文件中</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefylinjectpchreferencefordebuglib.asp">/Yl</a></td>
            <td width="71%">创建调试库时插入 PCH 引用</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.yu.asp">/Yu</a></td>
            <td width="71%">在生成期间使用预编译头文件</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.yx.asp">/YX</a></td>
            <td width="71%">自动处理预编译头</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.z7.2c_2f.zd.2c_2f.zi.asp">/Z7</a></td>
            <td width="71%">生成与 C 7.0 兼容的调试信息</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.za.2c_2f.ze.asp">/Za</a></td>
            <td width="71%">禁用语言扩展</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/vcrefzcconformance.asp">/Zc</a></td>
            <td width="71%">在 <a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.za.2c_2f.ze.asp">/Ze</a> 下指定标准行为</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.z7.2c_2f.zd.2c_2f.zi.asp">/Zd</a></td>
            <td width="71%">生成行号</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.za.2c_2f.ze.asp">/Ze</a></td>
            <td width="71%">启用语言扩展</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.zg.asp">/Zg</a></td>
            <td width="71%">生成函数原型</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a class=POPUP href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.z7.2c_2f.zd.2c_2f.zi.asp">/ZI</a></td>
            <td width="71%">将调试信息包含在与&#8220;编辑并继续&#8221;兼容的程序数据库中</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.z7.2c_2f.zd.2c_2f.zi.asp">/Zi</a></td>
            <td width="71%">生成完整的调试信息</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.zl.asp">/Zl</a></td>
            <td width="71%">从 .obj 文件中移除默认库名</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.zm.asp">/Zm</a></td>
            <td width="71%">指定预编译头内存分配限制</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.zp.asp">/Zp</a></td>
            <td width="71%">封装结构成员</td>
        </tr>
        <tr vAlign=top>
            <td width="29%"><a href="http://msdn.microsoft.com/library/CHS/vccore/html/_core_.2f.zs.asp">/Zs</a></td>
            <td width="71%">只检查语法</td>
        </tr>
    </tbody>
</table>
技术果然是靠迫出来的,好久之前想都没有想过的编译器的东西现在要研究了-_-.... 
<img src ="http://www.cppblog.com/fenglinuestc/aggbug/48311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fenglinuestc/" target="_blank">Lexili</a> 2008-04-28 10:41 <a href="http://www.cppblog.com/fenglinuestc/articles/48311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)C++中的预处理</title><link>http://www.cppblog.com/fenglinuestc/articles/48172.html</link><dc:creator>Lexili</dc:creator><author>Lexili</author><pubDate>Sat, 26 Apr 2008 01:09:00 GMT</pubDate><guid>http://www.cppblog.com/fenglinuestc/articles/48172.html</guid><wfw:comment>http://www.cppblog.com/fenglinuestc/comments/48172.html</wfw:comment><comments>http://www.cppblog.com/fenglinuestc/articles/48172.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/fenglinuestc/comments/commentRss/48172.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/fenglinuestc/services/trackbacks/48172.html</trackback:ping><description><![CDATA[一、预处理的由来：<br>在C++的历史发展中，有很多的语言特征（特别是语言的晦涩之处）来自于C语言，预<br>处理就是其中的一个。C++从C语言那里把C语言预处理器继承过来（C语言预处理器，被Bj<br>arne博士简称为Cpp，不知道是不是C Program Preprocessor的简称）。<br>二、常见的预处理功能：<br>预处理器的主要作用就是把通过预处理的内建功能对一个资源进行等价替换，最常见<br>的预处理有：文件包含，条件编译、布局控制和宏替换4种。<br>文件包含：#include 是一种最为常见的预处理，主要是做为文件的引用组合源程序正<br>文。<br>条件编译：#if,#ifndef,#ifdef,#endif,#undef等也是比较常见的预处理，主要是进<br>行编译时进行有选择的挑选，注释掉一些指定的代码，以达到版本控制、防止对文件重复<br>包含的功能。<br>布局控制：#progma，这也是我们应用预处理的一个重要方面，主要功能是为编译程序<br>提供非常规的控制流信息。<br>宏替换： #define，这是最常见的用法，它可以定义符号常量、函数功能、重新命名<br>、字符串的拼接等各种功能。<br>三、预处理指令：<br>预处理指令的格式如下：<br># directive tokens<br>#符号应该是这一行的第一个非空字符，一般我们把它放在起始位置。如果指令一行放<br>不下，可以通过\进行控制，例如：<br>#define Error if(error) exit(1) 等价于<br>#define Error \<br>if(error) exit(1)<br>不过我们为了美化起见，一般都不怎么这么用，更常见的方式如下：<br># ifdef __BORLANDC__<br>if_true&lt;(is_convertible&lt;Value,named_template_param_base&gt;::value)&gt;::<br>template then&lt;make_named_arg, make_key_value&gt;::type Make;<br># else<br>enum { is_named = is_named_parameter&lt;Value&gt;::value };<br>typedef typename if_true&lt;(is_named)&gt;::template<br>then&lt;make_named_arg, make_key_value&gt;::type Make;<br># endif<br>下面我们看一下常见的预处理指令：<br>#define 宏定义<br>#undef 未定义宏<br>#include 文本包含<br>#ifdef 如果宏被定义就进行编译<br>#ifndef 如果宏未被定义就进行编译<br>#endif 结束编译块的控制<br>#if 表达式非零就对代码进行编译<br>#else 作为其他预处理的剩余选项进行编译<br>#elif 这是一种#else和#if的组合选项<br><!--emo&:p--><!--endemo-->#line 改变当前的行数和文件名称<br>#error 输出一个错误信息<br>#pragma 为编译程序提供非常规的控制流信息<br>下面我们对这些预处理进行一一的说明，考虑到宏的重要性和繁琐性，我们把它放到<br>最后讲。<br>四、文件包含指令：<br>这种预处理使用方式是最为常见的，平时我们编写程序都会用到，最常见的用法是：<br>#include &lt;iostream&gt; //标准库头文件<br>#include &lt;iostream.h&gt; //旧式的标准库头文件<br>#include "IO.h" //用户自定义的头文件<br>#include "../file.h" //UNIX下的父目录下的头文件<br>#include "/usr/local/file.h" //UNIX下的完整路径<br>#include "..\file.h" //Dos下的父目录下的头文件<br>#include "\usr\local\file.h" //Dos下的完整路径<br>这里面有2个地方要注意：<br>1、我们用&lt;iostream&gt;还是&lt;iostream.h&gt;?<br>我们主张使用&lt;iostream&gt;，而不是&lt;iostream.h&gt;,为什么呢？我想你可能还记得我<br>曾经给出过几点理由，这里我大致的说一下：<br>首先，.h格式的头文件早在98年9月份就被标准委员会抛弃了，我们应该紧跟标准<br>，以适合时代的发展。<br>其次，iostream.h只支持窄字符集，iostream则支持窄/宽字符集。<br>还有，标准对iostream作了很多的改动，接口和实现都有了变化。<br>最后，iostream组件全部放入namespace std中，防止了名字污染。<br>2、&lt;io.h&gt;和"io.h"的区别？<br>其实他们唯一的区别就是搜索路径不同：<br>对于#include &lt;io.h&gt; ，编译器从标准库路径开始搜索<br>对于#include "io.h" ，编译器从用户的工作路径开始搜索<br>五、编译控制指令：<br>这些指令的主要目的是进行编译时进行有选择的挑选，注释掉一些指定的代码，以达<br>到版本控制、防止对文件重复包含的功能。<br>使用格式，如下：<br>1、<br>#ifdef identifier<br>your code<br>#endif<br>如果identifier为一个定义了的符号，your code就会被编译，否则剔除<br>2、<br>#ifndef identifier<br>your code<br>#endif<br>如果identifier为一个未定义的符号，your code就会被编译，否则剔除<br>3、<br>#if expression<br>your code<br>#endif<br>如果expression非零，your code就会被编译，否则剔除<br>4、<br>#ifdef identifier<br>your code1<br>#else<br>your code2<br>#endif<br>如果identifier为一个定义了的符号，your code1就会被编译，否则your<br>code2就会被编译<br>5、<br>#if expressin1<br>your code1<br>#elif expression2 //呵呵，elif<br>your code2<br>#else<br>your code3<br>#enif<br>如果epression1非零，就编译your code1，否则，如果expression2非零，就编译y<br>our code2，否则，就编译your code3<br>其他预编译指令<br>除了上面我们说的集中常用的编译指令，还有3种不太常见的编译指令：#line、#err<br>or、#pragma，我们接下来就简单的谈一下。<br>#line的语法如下：<br>#line number filename<br>例如：#line 30 a.h 其中，文件名a.h可以省略不写。<br>这条指令可以改变当前的行号和文件名，例如上面的这条预处理指令就可以改变当前<br>的行号为30，文件名是a.h。初看起来似乎没有什么用，不过，他还是有点用的，那就是用<br>在编译器的编写中，我们知道编译器对C++源码编译过程中会产生一些中间文件，通过这条<br>指令，可以保证文件名是固定的，不会被这些中间文件代替，有利于进行分析。<br>#error语法如下：<br>#error info<br>例如：#ifndef UNIX<br>#error This software requires the UNIX OS.<br>#endif<br>这条指令主要是给出错误信息，上面的这个例子就是，如果没有在UNIX环境下，就会<br>输出This software requires the UNIX OS.然后诱发编译器终止。所以总的来说，这条指<br>令的目的就是在程序崩溃之前能够给出一定的信息。<br>#pragma是非统一的，他要依靠各个编译器生产者，例如，在SUN C++编译器中：<br>// 把name和val的起始地址调整为8个字节的倍数<br>#progma align 8 (name, val)<br>char name[9];<br>double val;<br>//在程序执行开始，调用函数MyFunction<br>#progma init (MyFunction)<br>预定义标识符<br>为了处理一些有用的信息，预处理定义了一些预处理标识符，虽然各种编译器<br>的预处<br>理标识符不尽相同，但是他们都会处理下面的4种：<br>__FILE__ 正在编译的文件的名字<br>__LINE__ 正在编译的文件的行号<br>__DATE__ 编译时刻的日期字符串，例如： "25 Dec 2000"<br>__TIME__ 编译时刻的时间字符串，例如： "12:30:55"<br>例如：cout&lt;&lt;"The file is :"&lt;&lt;__FILE__"&lt;&lt;"! The lines is:<br>"&lt;&lt;__LINE__&lt;&lt;endl;<br>预处理何去何从<br>如何取代#include预处理指令，我们在这里就不再一一讨论了。<br>C++并没有为#include提供替代形式，但是namespace提供了一种作用域机制，<br>它能以<br>某种方式支持组合，利用它可以改善#include的行为方式，但是我们还是无法取代<br>#include。<br>#progma应该算是一个可有可无的预处理指令，按照C++之父Bjarne的话说，就<br>是："<br>#progma被过分的经常的用于将语言语义的变形隐藏到编译系统里，或者被用于提<br>供带有特殊语义和笨拙语法的语言扩充。&#8221;<br>对于#ifdef，我们仍然束手无策，就算是我们利用if语句和常量表达式，仍然<br>不足以<br>替代她，因为一个if语句的正文必须在语法上正确，满足类检查，即使他处在一个<br>绝不会被执行的分支里面。 <br>
<img src ="http://www.cppblog.com/fenglinuestc/aggbug/48172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/fenglinuestc/" target="_blank">Lexili</a> 2008-04-26 09:09 <a href="http://www.cppblog.com/fenglinuestc/articles/48172.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>