﻿<?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++博客-榕树驿站-随笔分类-基础学习</title><link>http://www.cppblog.com/xpzhou/category/4064.html</link><description>要是生命真的有如果，就不会有这么多的遗憾；要是等一分钟可以如愿，就不会有这么多的伤感...</description><language>zh-cn</language><lastBuildDate>Thu, 22 May 2008 12:05:50 GMT</lastBuildDate><pubDate>Thu, 22 May 2008 12:05:50 GMT</pubDate><ttl>60</ttl><item><title>HOWTO: Create Debug Symbols for a Visual C++ Application</title><link>http://www.cppblog.com/xpzhou/archive/2007/06/11/26109.html</link><dc:creator>榕树藤</dc:creator><author>榕树藤</author><pubDate>Mon, 11 Jun 2007 14:54:00 GMT</pubDate><guid>http://www.cppblog.com/xpzhou/archive/2007/06/11/26109.html</guid><wfw:comment>http://www.cppblog.com/xpzhou/comments/26109.html</wfw:comment><comments>http://www.cppblog.com/xpzhou/archive/2007/06/11/26109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xpzhou/comments/commentRss/26109.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xpzhou/services/trackbacks/26109.html</trackback:ping><description><![CDATA[在 Visual C++ .NET 开发环境中为应用程序创建符号文件：
<table class="list ol">
    <tbody>
        <tr>
            <td class=number>1.</td>
            <td class=text>在&#8220;解决方案资源管理器&#8221;中，右击要修改的项目，然后单击<strong>属性</strong>。</td>
        </tr>
        <tr>
            <td class=number>2.</td>
            <td class=text>在&#8220;配置属性&#8221;窗口中，单击<strong>C/C++</strong> 文件夹，然后单击<strong>常规</strong>。</td>
        </tr>
        <tr>
            <td class=number>3.</td>
            <td class=text>在<strong>调试信息格式</strong>下拉列表中，单击选择<strong>程序数据库 (/Zi)</strong>。</td>
        </tr>
        <tr>
            <td class=number>4.</td>
            <td class=text>如果您希望在调试转储文件或执行实时调试时获得有关局部变量的信息，请单击选择<strong>优化</strong>下拉列表中的<strong>禁用 (/Od)</strong>。</td>
        </tr>
        <tr>
            <td class=number>5.</td>
            <td class=text>在&#8220;配置属性&#8221;窗口的 Linker 文件夹中，确保&#8220;调试&#8221;子类别的<strong>生成调试信息</strong>属性设置为<strong>是 (/DEBUG)</strong>。<strong>备注</strong>：尽管并不要求您在同一子类别中同样启用<strong>生成映射文件</strong>，但该选项会创建一个 .map 文件，当您只有发生访问冲突的地址时，该文件对确定发生故障的位置可能很有用。有关更多信息，请参见&#8220;参考&#8221;部分。 </td>
        </tr>
    </tbody>
</table>
在 Visual C++ 6.0 开发环境中为应用程序创建符号文件：
<table class="list ol">
    <tbody>
        <tr>
            <td class=number>1.</td>
            <td class=text>在<strong>项目</strong>菜单上，选择<strong>设置</strong>。</td>
        </tr>
        <tr>
            <td class=number>2.</td>
            <td class=text>在<strong>C/C++</strong> 选项卡上，将<strong>类别</strong>更改为<strong>常规</strong>。</td>
        </tr>
        <tr>
            <td class=number>3.</td>
            <td class=text>在<strong>调试信息</strong>下拉列表中，选择<strong>程序数据库</strong>。<strong>备注</strong>：如果您希望在调试转储文件或执行实时调试时获得有关局部变量的信息，还应该选择<strong>优化</strong>下拉列表中的<strong>禁用（调试）</strong>。<br><br></td>
        </tr>
        <tr>
            <td class=number>4.</td>
            <td class=text>在<strong>链接</strong>选项卡上，将<strong>类别</strong>更改为<strong>调试</strong>。</td>
        </tr>
        <tr>
            <td class=number>5.</td>
            <td class=text>在<strong>调试信息</strong>部分，确保选中<strong>调试信息</strong> 选项，然后选择<strong>两种格式</strong>。<strong>备注</strong>：尽管不要求您在<strong>链接</strong>选项卡上同样启用<strong>常规</strong>类别中的<strong>生成映射文件</strong>，但该选项会创建一个 .map 文件，当您只有发生访问冲突的地址时，该文件对确定发生故障的位置可能很有用。（有关更多信息，请参见&#8220;参考&#8221;。） </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/xpzhou/aggbug/26109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xpzhou/" target="_blank">榕树藤</a> 2007-06-11 22:54 <a href="http://www.cppblog.com/xpzhou/archive/2007/06/11/26109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC++6.0编译环境介绍</title><link>http://www.cppblog.com/xpzhou/archive/2007/06/08/25807.html</link><dc:creator>榕树藤</dc:creator><author>榕树藤</author><pubDate>Fri, 08 Jun 2007 02:00:00 GMT</pubDate><guid>http://www.cppblog.com/xpzhou/archive/2007/06/08/25807.html</guid><wfw:comment>http://www.cppblog.com/xpzhou/comments/25807.html</wfw:comment><comments>http://www.cppblog.com/xpzhou/archive/2007/06/08/25807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xpzhou/comments/commentRss/25807.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xpzhou/services/trackbacks/25807.html</trackback:ping><description><![CDATA[<font face=宋体><span lang=ZH-CN><font size=3>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%" align=left>大家可能一直在用</font></span><font size=3>VC<span lang=ZH-CN>开发软件，但是对于这个编译器却未必很了解。原因是多方面的。大多数情况下，我们只停留在&#8220;使用&#8221;它，而不会想去&#8220;了解&#8221;它。因为它只是一个工具，我们宁可把更多的精力放在</span>C++<span lang=ZH-CN>语言和软件设计上。我们习惯于这样一种&#8220;模式&#8221;：建立一个项目，然后写代码，然后编译，反反复复调试。但是，所谓：&#8220;公欲善其事，必先利其器&#8221;。如果我们精于</span>VC<span lang=ZH-CN>开发环境，我们是不是能够做得更加游刃有余呢？</span></font></font></p>
<style="margin-top: 200%?&gt; LINE-HEIGHT: 0px; MARGIN-BOTTOM:><br><font face=宋体 size=3>Visual C++可新建的 Projects项目</font>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3><img height=487 src="http://www.vbgamedev.com/newc/VC_Make/3.GIF" width=943 border=0></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>Visual C++可新建的 File文件</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%">　</p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%" align=center><font face=宋体 size=3><img height=272 src="http://www.vbgamedev.com/newc/VC_Make/6.GIF" width=222 border=0></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>Visual C++的Build设置</font></strong><font size=3><br>1.Compile TEST.cpp选项 只编译当前文件而不调用链接器或其它工具。输出窗口将显示编译过程检查出的错误或警告信息，在错误信息处单击鼠标右键，可以得到错误代码的位置<br>2. Build TEST.exe 选项 对最后修改过的源文件进行编译和链接<br>3. Rebuild All选项 该选项允许用户编译所有的源文件，而不管它们何时曾经被修改过<br>4. Batch Build选项 该选项能单步重新建立多个工程文件，并允许用户指定要建立的项目类型.VC提供了两种目标应用程序类型 Win32 Release（发行版）、Win32 Debug（调试版）。</font></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3><br>&nbsp;</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><span lang=ZH-CN><font size=3>我们先来看一下</font></span><font size=3>VC<span lang=ZH-CN>的处理流程，大致分为两步：编译和连接。源文件通过编译生成了</span>.obj<span lang=ZH-CN>文件；所有</span>.obj<span lang=ZH-CN>文件和</span>.lib<span lang=ZH-CN>文件通过连接生成</span>.exe<span lang=ZH-CN>文件或</span>.dll</font><span lang=ZH-CN><font size=3>文件。下面，我们分别讨论这两个步骤的一些细节。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%">　</p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3><strong>工程配置对话框</strong> 在这个对话框中，左上方的下拉列表框用于选择一种工程配置，包括有Win32 Debug、Win32 Release和All Configurations（指前两种配置一起），某些选项在不同的工程配置中有不同的缺省值。左边的树形视图给出了当前工程所有的文件及分类情况。如果我们把工程&#8220;Schedule&#8221;置为高亮显示（正如图9-1那样），对话框的右边就会出现总共十个选项卡，其中列出了与工程有关的各种选项，不少选项卡中有一个Reset按钮，按下它后可以把选项卡内的各项设置恢复到生成工程时的初始值。如果我们在树形视图中选择一个文件类或一个文件，那么对话框右边的选项卡会自动减少到一个或两个，其中列出的都是与选中的文件类或文件有关的选项。</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>&nbsp;<strong><span lang=ZH-CN>编译参数的设置</span></strong><span lang=ZH-CN>。主要通过</span>VC<span lang=ZH-CN>的菜单项</span>Project-&gt;Settings-&gt;C/C++<span lang=ZH-CN>页来完成。我们可以看到这一页的最下面</span>Project Options</font><span lang=ZH-CN><font size=3>中的内容，一般如下：</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><span style="COLOR: #003366"><font face=宋体 size=3>/nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"Debug/WritingDlgTest.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ /c</font></span></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><span lang=ZH-CN><font size=3>各个参数代表的意义，可以参考</font></span><font size=3><a href="http://www.vbgamedev.com/newc/VC_Make/VCEXT.txt"><u><font color=#0000ff>Project&nbsp;Option语法解释</font></u></a><span lang=ZH-CN>。比如</span>/nologo<span lang=ZH-CN>表示编译时不在输出窗口显示这些设置（我们可以把这个参数去掉来看看效果）等等。一般我们不会直接修改这些设置，而是通过这一页最上面的</span>Category</font><span lang=ZH-CN><font size=3>中的各项来完成。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3><img height=453 src="http://www.vbgamedev.com/newc/VC_Make/7.GIF" width=677 border=0></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>1)<strong>General</strong><span lang=ZH-CN>：一些总体设置。</span>Warning level<span lang=ZH-CN>用来控制警告信息，</span>None表示不显示任何警告，L1表示只显示严重的警告，L2表示显示比L1次严重的警告，L4则表示显示出所有的警告，包括那些安全忽略的警告<span lang=ZH-CN>；</span>Warnings as errors<span lang=ZH-CN>将警告信息当作错误处理</span>，这样在编译完毕后就无法启动连接器来进行连接<span lang=ZH-CN>；</span>Optimizations<span lang=ZH-CN>是代码优化，可以在</span>Category<span lang=ZH-CN>的</span>Optimizations<span lang=ZH-CN>项中进行更细的设置；</span>Generate browse info<span lang=ZH-CN>用以生成</span>.sbr<span lang=ZH-CN>文件，记录类、变量等符号信息，可以在</span>Category<span lang=ZH-CN>的</span>Listing Files<span lang=ZH-CN>项中进行更多的设置。</span>Debug info<span lang=ZH-CN>，生成调试信息：</span>None<span lang=ZH-CN>，不产生任何调试信息（编译比较快）；</span>Line Numbers Only<span lang=ZH-CN>，仅生成全局的和外部符号的调试信息到</span>.OBJ<span lang=ZH-CN>文件或</span>.EXE<span lang=ZH-CN>文件，减小目标文件的尺寸；</span>C 7.0- Compatible<span lang=ZH-CN>，记录调试器用到的所有符号信息到</span>.OBJ<span lang=ZH-CN>文件和</span>.EXE<span lang=ZH-CN>文件；</span>Program Database<span lang=ZH-CN>，创建</span>.PDB<span lang=ZH-CN>文件记录所有调试信息；</span>Program Database for "Edit &amp; Continue"<span lang=ZH-CN>，创建</span>.PDB</font><span lang=ZH-CN><font size=3>文件记录所有调试信息，并且支持调试时编辑。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%">　</p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3><img height=453 src="http://www.vbgamedev.com/newc/VC_Make/8.GIF" width=422 border=0></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>2)<strong>C++ Language</strong><span lang=ZH-CN>：</span>pointer_to_member representation<span lang=ZH-CN>用来设置类定义</span>/<span lang=ZH-CN>引用的先后关系，一般为</span>Best-Case Always<span lang=ZH-CN>表示在引用类之前该类肯定已经定义了；</span>Enable Exception Handling<span lang=ZH-CN>，进行同步的异常处理；</span>Enable Run-Time Type Information<span lang=ZH-CN>迫使编译器增加代码在运行时进行对象类型检查；</span>Disable Construction Displacements<span lang=ZH-CN>，设置类构造</span>/</font><span lang=ZH-CN><font size=3>析构函数调用虚函数问题。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%">　</p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3><img height=453 src="http://www.vbgamedev.com/newc/VC_Make/9.GIF" width=426 border=0>&nbsp;&nbsp; <img height=453 src="http://www.vbgamedev.com/newc/VC_Make/10.GIF" width=423 border=0></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>3)<strong>Code Generation</strong><span lang=ZH-CN>：</span>Processor<span lang=ZH-CN>表示代码指令优化，可以为</span>80386<span lang=ZH-CN>、</span>80486<span lang=ZH-CN>、</span>Pentium<span lang=ZH-CN>、</span>Pentium Pro<span lang=ZH-CN>，或者</span>Blend<span lang=ZH-CN>表示混合以上各种优化。</span>Use run-time library<span lang=ZH-CN>用以指定程序运行时使用的运行时库（单线程或多线程，</span>Debug<span lang=ZH-CN>版本或</span>Release<span lang=ZH-CN>版本），有一个原则就是，一个进程不要同时使用几个版本的运行时库。</span>Single-Threaded<span lang=ZH-CN>，静态连接</span>LIBC.LIB<span lang=ZH-CN>库；</span>Debug Single-Threaded<span lang=ZH-CN>，静态连接</span>LIBCD.LIB<span lang=ZH-CN>库；</span>Multithreaded<span lang=ZH-CN>，静态连接</span>LIBCMT.LIB<span lang=ZH-CN>库；</span>Debug Multithreaded<span lang=ZH-CN>，静态连接</span>LIBCMTD.LIB<span lang=ZH-CN>库；</span>Multithreaded DLL<span lang=ZH-CN>，动态连接</span>MSVCRT.DLL<span lang=ZH-CN>库；</span>Debug Multithreaded DLL<span lang=ZH-CN>，动态连接</span>MSVCRTD.DLL<span lang=ZH-CN>库。连接了单线程库就不支持多线程调用，连接了多线程库就要求创建多线程的应用程序。</span>Calling convention<span lang=ZH-CN>可以用来设定调用约定，有三种：</span>__cdecl<span lang=ZH-CN>、</span>__fastcall<span lang=ZH-CN>和</span>__stdcall<span lang=ZH-CN>。各种调用约定的主要区别在于，函数调用时，函数的参数是从左到右压入堆栈还是从右到左压入堆栈；在函数返回时，由函数的调用者来清理压入堆栈的参数还是由函数本身来清理；以及在编译时对函数名进行的命名修饰（可以通过</span>Listing Files<span lang=ZH-CN>看到各种命名修饰方式）。</span>Struct member alignment<span lang=ZH-CN>用以指定数据结构中的成员变量在内存中是按几字节对齐的，根据计算机数据总线的位数，不同的对齐方式存取数据的速度不一样。这个参数对数据包网络传输等应用尤为重要，不是存取速度问题，而是数据位的精确定义问题，一般在程序中使用</span>#pragma pack</font><span lang=ZH-CN><font size=3>来指定。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%">　</p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>4)<strong>Customize</strong><span lang=ZH-CN>：</span>Disable Language Extensions<span lang=ZH-CN>，表示不使用微软为标准</span>C<span lang=ZH-CN>做的语言扩展；</span>Eliminate Duplicate Strings</font><span lang=ZH-CN><font size=3>，主要用于字符串优化（将字符串放到缓充池里以节省空间），使用这个参数，使得</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>char *sBuffer = "This is a character buffer";</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>char *tBuffer = "This is a character buffer";</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>sBuffer</font><font size=3><span lang=ZH-CN>和</span>tBuffer<span lang=ZH-CN>指向的是同一块内存空间；</span>Enable Function-Level Linking <span lang=ZH-CN>，告诉编译器将各个函数按打包格式编译；</span>Enables minimal rebuild<span lang=ZH-CN>，通过保存关联信息到</span>.IDB<span lang=ZH-CN>文件，使编译器只对最新类定义改动过的源文件进行重编译，提高编译速度；</span>Enable Incremental Compilation<span lang=ZH-CN>，同样通过</span>.IDB<span lang=ZH-CN>文件保存的信息，只重编译最新改动过的函数；</span>Suppress Startup Banner and Information Messages<span lang=ZH-CN>，用以控制参数是否在</span>output</font><span lang=ZH-CN><font size=3>窗口输出。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%">　</p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>5)<span style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">&nbsp;</span><strong>Listing Files</strong><span lang=ZH-CN>：</span>Generate browse info<span lang=ZH-CN>的功能上面已经提到过。这里可以进行更多的设置。</span>Exclude Local Variables from Browse Info<span lang=ZH-CN>表示是否将局部变量的信息放到</span>.SBR<span lang=ZH-CN>文件中。</span>Listing file type<span lang=ZH-CN>可以设置生成的列表信息文件的内容：</span>Assembly-Only Listing<span lang=ZH-CN>仅生成汇编代码文件（</span>.ASM<span lang=ZH-CN>扩展名）；</span>Assembly With Machine Code<span lang=ZH-CN>生成机器代码和汇编代码文件（</span>.COD<span lang=ZH-CN>扩展名）；</span>Assembly With Source Code<span lang=ZH-CN>生成源代码和汇编代码文件（</span>.ASM<span lang=ZH-CN>扩展名）；</span>Assembly, Machine Code, and Source<span lang=ZH-CN>生成机器码、源代码和汇编代码文件（</span>.COD<span lang=ZH-CN>扩展名）。</span>Listing file name<span lang=ZH-CN>为生成的信息文件的路径，一般为</span>Debug<span lang=ZH-CN>或</span>Release</font><span lang=ZH-CN><font size=3>目录下，生成的文件名自动取源文件的文件名。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%">　</p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3><img height=453 src="http://www.vbgamedev.com/newc/VC_Make/12.GIF" width=424 border=0>&nbsp; </font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>6)<strong>Optimizations<span lang=ZH-CN>：</span></strong><span lang=ZH-CN>代码优化设置。可以选择</span><span style="COLOR: #003366">Maximize Speed</span><span lang=ZH-CN>生成最快速的代码，或</span><span style="COLOR: #003366">Minimize Size</span><span lang=ZH-CN>生成最小尺寸的程序，或者</span>Customize</font><span lang=ZH-CN><font size=3>定制优化。定制的内容包括：</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><span style="COLOR: #003366"><font size=3>Assume No Aliasing</font></span><font size=3><span lang=ZH-CN>，不使用别名（提高速度）；</span> </font></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><span style="COLOR: #003366"><font size=3>Assume Aliasing Across Function Calls</font></span><span lang=ZH-CN><font size=3>，仅函数内部不使用别名；</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><span style="COLOR: #003366"><font size=3>Global Optimizations</font></span><span lang=ZH-CN><font size=3>，全局优化，比如经常用到的变量使用寄存器保存，或者循环内的计算优化，如</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>i</font><font size=3> = -100;</font></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>while( i &lt; 0 ){ &nbsp;&nbsp; i += x + y;}</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><span lang=ZH-CN><font face=宋体 size=3>会被优化为</font></span></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>i</font><font size=3> = -100;</font></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>t = x + y;</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>while( i &lt; 0 ){i += t;}</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><span style="COLOR: #003366"><font size=3>Generate Intrinsic Functions</font></span><font size=3><span lang=ZH-CN>，使用内部函数替换一些函数调用（提高速度）；</span> </font></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><span style="COLOR: #003366"><font size=3>Improve Float Consistency</font></span><span lang=ZH-CN><font size=3>，浮点运算方面的优化；</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><span style="COLOR: #003366"><font size=3>Favor Small Code</font></span><font size=3><span lang=ZH-CN>，程序（</span>exe<span lang=ZH-CN>或</span>dll</font><span lang=ZH-CN><font size=3>）尺寸优化优先于代码速度优化；</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><span style="COLOR: #003366"><font size=3>Favor Fast Code</font></span><font size=3><span lang=ZH-CN>，程序（</span>exe<span lang=ZH-CN>或</span>dll</font><span lang=ZH-CN><font size=3>）代码速度优化优先于尺寸优化；</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><span style="COLOR: #003366"><font size=3>Frame-Pointer Omission</font></span><span lang=ZH-CN><font size=3>，不使用帧指针，以提高函数调用速度；</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><span style="COLOR: #003366"><font size=3>Full Optimization</font></span><span lang=ZH-CN><font size=3>，组合了几种参数，以生成最快的程序代码。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>Inline function expansion<span lang=ZH-CN>，内联函数扩展的三种优化（使用内联可以节省函数调用的开销，加快程序速度）：</span>Disable<span lang=ZH-CN>不使用内联；</span>Only __inline<span lang=ZH-CN>，仅函数定义前有</span>inline<span lang=ZH-CN>或</span>__inline<span lang=ZH-CN>标记使用内联；</span>Any Suitable<span lang=ZH-CN>，除了</span>inline<span lang=ZH-CN>或</span>__inline</font><span lang=ZH-CN><font size=3>标记的函数外，编译器&#8220;觉得&#8221;应该使用内联的函数，都使用内联。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%">　</p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3><img height=453 src="http://www.vbgamedev.com/newc/VC_Make/13.GIF" width=423 border=0></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>7)<strong>Precompiled Headers</strong></font><span lang=ZH-CN><font size=3>：预编译头文件的设置。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><span lang=ZH-CN><font size=3>&nbsp;</font></span></font><font face=宋体 size=3>预编译头的概念： 所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的)，这个文件就称为预编译头文件这些预先编译好的代码可以是任何的C/C++代码--------甚至是inline的函数，但是必须是稳定的，在工程开发的过程中不会被经常改变。如果这些代码被修改，则需要重新编译生成预编译头文件。</font><font face=宋体><span lang=ZH-CN><font size=3>你可将将一些公共的、不大变动的头文件（比如</font></span><font size=3>FILEX.h<span lang=ZH-CN>等）集中放到</span>stdafx.h<span lang=ZH-CN>中，这一部分代码就不必每次都重新编译（除非是</span>Rebuild All</font><span lang=ZH-CN><font size=3>）。</font></span></font><font face=宋体 size=3>注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大，通常有6-7M大。<span lang=ZH-CN>使用预编译可以提高重复编译的速度。</span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><span lang=zh-cn><font face=宋体 size=3>&nbsp; </font></span><font face=宋体 size=3>也许你会问：现在的编译器都有Time stamp的功能，编译器在编译整个工程的时候，它只会编译那些经过修改的文件，而不会去编译那些从上次编译过，到现在没有被修改过的文件。那么为什么还要预编译头文件呢？答案在这里，我们知道编译器是以文件为单位编译的，一个文件经过修改后，会重新编译整个文件，当然在这个文件里包含的所有头文件中的东西（.eg Macro, Preprocessor ）都要重新处理一遍。VC的预编译头文件保存的正是这部分信息。以避免每次都要重新处理这些头文件。</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>1.这里是使用工程里的设置，/Yu&#8221;stdafx.h&#8221;。如果使用了/Yu，就是说使用了预编译，我们在每个.cpp文件的最开头，我强调一遍是最开头，包含 你指定产生pch文件的.h文件（默认是stdafx.h）不然就会有问题。如果你没有包含这个文件，就告诉你Unexpected file end. 如果你不是在最开头包含的</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>2.如果你把pch文件不小心丢了，最简单的办法就是选中第一个选项&#8220;Not&nbsp;using....",这样就根本不用预编译头也不去寻找pch文件，就不会出错了，但是这样做的后果是每次编译、连接都化更多的时间。也可以选第二个选项&#8221;Automatic&nbsp;use of",然后在&#8220;Through&nbsp;header&#8221;力填上stdafx.h，这样如果没有pch文件系统会自动生成一个pch，如果有的话就使用这个pch，这个选项是比较&#8220;智能&#8221;的。第三个选项是强行创建一个pch文件，第四个选项是直接使用pch文件。当然&#8220;Through headers&#8221;里都填stdafx.h了。</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>让编译器生成一个pch文件就可以了。也就是说把 stdafx.cpp（即指定/Yc的那个cpp文件）从新编译一遍就可以了。当然你可以傻傻的 Rebuild all。</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%">　</p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>8)<span style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal"> </span><strong>Preprocessor</strong><span lang=ZH-CN>：预编译处理。</span>我们可以在这里预先定义一些宏名，指定部分或所有符号具有未定义状态<span lang=ZH-CN>。</span>Additional include directories<span lang=ZH-CN>，可以指定额外的包含目录，一般是相对于本项目的目录，如</span>..\Include</font><span lang=ZH-CN><font size=3>。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%">　</p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>Link连接参数</font></strong><font size=3><span lang=ZH-CN><strong>的设置</strong>。主要通过</span>VC<span lang=ZH-CN>的菜单项</span>Project-&gt;Settings-&gt;Link<span lang=ZH-CN>页来完成。我们可以看到这一页的最下面</span>Project Options</font><span lang=ZH-CN><font size=3>中的内容，一般如下：</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><span style="COLOR: #003366"><font face=宋体 size=3>/nologo /subsystem:windows /incremental:yes /pdb:"Debug/WritingDlgTest.pdb" /debug /machine:I386 /out:"Debug/WritingDlgTest.exe" /pdbtype:sept</font></span></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><span lang=ZH-CN><font size=3>下面我们分别来看一下</font></span><font size=3>Category</font><span lang=ZH-CN><font size=3>中的各项设置。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3><img height=453 src="http://www.vbgamedev.com/newc/VC_Make/15.GIF" width=422 border=0>&nbsp; <img height=453 src="http://www.vbgamedev.com/newc/VC_Make/16.GIF" width=424 border=0></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>1<span style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">.&nbsp;</span><strong>General</strong><span lang=ZH-CN>：一些总体设置。可以设置生成的文件路径、文件名 如</span>在&#8220;Output &nbsp; file &nbsp; name:&#8221;下面的编辑框中可输入：&#8220;C:\bin\TEST.exe&#8221;<span lang=ZH-CN>；连接的库文件；</span>Generate debug info<span lang=ZH-CN>，生成</span>Debug<span lang=ZH-CN>信息到</span>.PDB<span lang=ZH-CN>文件（具体格式可以在</span>Category-&gt;Debug<span lang=ZH-CN>中设置）；</span>Ignore All Default Libraries<span lang=ZH-CN>，放弃所有默认的库连接；</span>Link Incrementally<span lang=ZH-CN>，通过生成</span>. ILK<span lang=ZH-CN>文件实现递增式连接以提高后续连接速度，但一般这种方式下生成的文件（</span>EXE<span lang=ZH-CN>或</span>DLL<span lang=ZH-CN>）较大；</span>Generate Mapfile<span lang=ZH-CN>，生成</span>.MAP<span lang=ZH-CN>文件记录模块相关信息；</span>Enable Profiling<span lang=ZH-CN>，这个参数通常与</span>Generate Mapfile<span lang=ZH-CN>参数同时使用，而且如果产生</span>Debug<span lang=ZH-CN>信息的话，不能用</span>.PDB<span lang=ZH-CN>文件，而且必须用</span>Microsoft Format<span lang=ZH-CN>。</span> &nbsp; </font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>2<span style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">.&nbsp; </span><strong>Customize</strong><span lang=ZH-CN>：这里可以进行使用程序数据库文件的设置。</span>选中Use program database允许使用程序数据库，这样连接器会把调试信息放在程序数据库中，如果不选中该选项，那么也不能使用递增连接方式。Force File Output <span lang=ZH-CN>，</span>即使某个模块引用了一些未定义或者重复定义的符号，连接器仍然会<span lang=ZH-CN>强制</span>（但不一定能正确运行）<span lang=ZH-CN>产生输出文件（</span>EXE<span lang=ZH-CN>或</span>DLL<span lang=ZH-CN>）；</span>Print Progress Messages<span lang=ZH-CN>，可以将连接过程中的进度信息输出到</span>Output</font><span lang=ZH-CN><font size=3>窗口。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>&nbsp;<img height=453 src="http://www.vbgamedev.com/newc/VC_Make/17.GIF" width=424 border=0>&nbsp; <img height=453 src="http://www.vbgamedev.com/newc/VC_Make/18.GIF" width=425 border=0></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>3<span style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">. </span><strong>Debug<span lang=ZH-CN>：</span></strong><span lang=ZH-CN>设置是否生成调试信息，以及调试信息的格式。格式可以有</span>Microsoft Format<span lang=ZH-CN>、</span>COFF Format<span lang=ZH-CN>（</span>Common Object File Format<span lang=ZH-CN>）和</span>Both Formats（两种都有<span lang=ZH-CN>）三种选择；</span>Separate Types<span lang=ZH-CN>，表示将</span>Debug<span lang=ZH-CN>格式信息以独立的</span>.PDB<span lang=ZH-CN>文件存放，还是直接放在各个源文件的</span>.PDB</font><span lang=ZH-CN><font size=3>文件中。选中的话，表示采用后者的方式，这种方式调试启动比较快。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>4<span style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">.&nbsp;</span><strong>Input<span lang=ZH-CN>：</span></strong><span lang=ZH-CN>这里可以指定要连接的库文件，放弃连接的库文件。还可以增加额外的库文件目录，一般是相对于本项目的目录，如</span>..\Lib<span lang=ZH-CN>。</span>Force Symbol References<span lang=ZH-CN>，可以指定连接特定符号定义的库。</span>&nbsp;如 在&#8220;Object/library &nbsp; Modules:&#8221;下面的编辑框中输入：&#8220;TestDll.lib&#8221;；在&#8220;Additional &nbsp; library &nbsp; path:&#8221;下面的编辑框中输入：&#8220;C:\bin&#8221;。可用Workspace另一个工程编译的静态库<br>　</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>5.<strong>Output<span lang=ZH-CN>：</span></strong>Base Address<span lang=ZH-CN>可以改变程序默认的基地址（</span>EXE<span lang=ZH-CN>文件默认为</span>0x400000<span lang=ZH-CN>，</span>DLL<span lang=ZH-CN>默认为</span>0x10000000<span lang=ZH-CN>），操作系统装载一个程序时总是试着先从这个基地址开始。</span>Entry-Point Symbol<span lang=ZH-CN>可以指定程序的入口地址，一般为一个函数名（且必须采用</span>__stdcall<span lang=ZH-CN>调用约定）。一般</span>Win32<span lang=ZH-CN>的程序，</span>EXE<span lang=ZH-CN>的入口为</span>WinMain<span lang=ZH-CN>，</span>DLL<span lang=ZH-CN>的入口为</span>DllEntryPoint<span lang=ZH-CN>；最好让连接器自动设置程序的入口点。默认情况下，通过一个</span>C<span lang=ZH-CN>的运行时库函数来实现：控制台程序采用</span>mainCRTStartup (<span lang=ZH-CN>或</span>wmainCRTStartup)<span lang=ZH-CN>去调用程序的</span>main (<span lang=ZH-CN>或</span>wmain)<span lang=ZH-CN>函数；</span>Windows<span lang=ZH-CN>程序采用</span>WinMainCRTStartup (<span lang=ZH-CN>或</span> wWinMainCRTStartup)<span lang=ZH-CN>调用程序的</span>WinMain (<span lang=ZH-CN>或</span> wWinMain<span lang=ZH-CN>，必须采用</span>__stdcall<span lang=ZH-CN>调用约定</span>)<span lang=ZH-CN>；</span>DLL<span lang=ZH-CN>采用</span>_DllMainCRTStartup<span lang=ZH-CN>调用</span>DllMain<span lang=ZH-CN>函数（必须采用</span>__stdcall<span lang=ZH-CN>调用约定）。</span>Stack allocations<span lang=ZH-CN>，用以设置程序使用的堆栈大小（请使用十进制），默认为</span>1<span lang=ZH-CN>兆字节。</span>Version Information<span lang=ZH-CN>告诉连接器在</span>EXE<span lang=ZH-CN>或</span>DLL<span lang=ZH-CN>文件的开始部分放上版本号。</span>一般情况下都不用改变。</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>&nbsp;</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><span lang=ZH-CN><font size=3>值得注意的是</font></span></strong><font size=3><span lang=ZH-CN>，上面各个参数是大小写敏感的；在参数后加上&#8220;</span>-<span lang=ZH-CN>&#8221;表示该参数无效；各个参数值选项有&#8220;</span>*<span lang=ZH-CN>&#8221;的表示为该参数的默认值；可以使用页右上角的&#8220;</span>Reset</font><span lang=ZH-CN><font size=3>&#8221;按钮来恢复该页的所有默认设置。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>&nbsp;</font></p>
<div style="TEXT-INDENT: 21.25pt">
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>9)<strong>Resources选项卡</strong>&nbsp; Resources选项卡控制着VC6的资源编译器。如图9-5所示，我们可以指定编译后生成的资源文件的路径，资源的语言类型，以及额外的资源包含目录。</font></p>
</div>
<div style="TEXT-INDENT: 21.25pt">
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>&nbsp;MIDL选项卡 这个选项卡与COM（组件对象模型）编程有关，我们不讨论它。</font></p>
</div>
<div style="TEXT-INDENT: 21.25pt">　
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>10)Browse Info选项卡 在这个选项卡中，我们可以指定是否在建立工程的同时也生成浏览信息文件，有了这个文件后，我们就能够在文本编辑器中通过关联菜单的相应命令快速定位到某个符号的定义或引用的地方。</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 200%">　</p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>11)</font><strong><font face=宋体 size=3>Pre-link step </font></strong></p>
<div style="TEXT-INDENT: 21.25pt">
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>这个选项卡用于添加在连接之前要执行的命令。</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 200%">　</p>
</div>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>l<span style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">2</span></font></font><font face=宋体 size=3>)</font><font face=宋体><font size=3><span style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal"> </span></font><strong><font size=3>Post-build step </font></strong></font></p>
<div style="TEXT-INDENT: 21.25pt">
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>这个选项卡用于添加在工程建立完毕之后要执行的命令&nbsp;如 &#8220;copy debug\TestDll.lib C:\bin\TestDll.lib&#8221; 并在C盘下建一个bin目录 做的件事情就是把TestDLL.lib拷贝到C:\bin所在的文件夹中<br>　</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 200%">　</p>
</div>
</div>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><span lang=ZH-CN><font size=3>其它一些参数设置</font></span></strong><span lang=ZH-CN><font size=3>。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3><img height=453 src="http://www.vbgamedev.com/newc/VC_Make/19.GIF" width=425 border=0>&nbsp;&nbsp; <img height=453 src="http://www.vbgamedev.com/newc/VC_Make/20.GIF" width=424 border=0></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>13)<span style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">&nbsp;</span><strong>Project-&gt;Settings-&gt;General</strong><span lang=ZH-CN>，可以设置连接</span>MFC<span lang=ZH-CN>库的方式（静态或动态）。如果是动态连接，在你的软件发布时不要忘了带上</span>MFC<span lang=ZH-CN>的</span>DLL<span lang=ZH-CN>。</span>第二个选项用于指定在编译连接过程中生成的中间文件和输出文件的存放目录，对于调试版本来说，缺省的目录是工程下面的&#8220;Debug&#8221;子目录。最下面的第三个选项用于指定是否允许每种工程配置都有自己的文件依赖关系（主要指头文件），由于绝大多数工程的调试版本和发布版本都具有相同的文件依赖关系，所以通常不需要更改该选项。</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%">　</p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>14)<span style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal">&nbsp;</span><strong>Project-&gt;Settings-&gt;Debug</strong><span lang=ZH-CN>，可以设置调试时运行的可执行文件，</span>如果正在编写的程序是一个DLL，那么应在此处指定一个用来调试该DLL的EXE文件。另外三个选项可以指定用于调试的工作目录，开始调试时给程序传送的命令行参数，以及进行远程调试时可执行文件的路径。把类别切换到Additional DLLs后，我们可以指定在开始调试时是否为一些额外的DLL装载调试符号信息，只有装载了符号信息后才能跟踪进DLL。</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%">　</p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>15)<strong>Project-&gt;Settings-&gt;Custom Build</strong><span lang=ZH-CN>，可以设置编译</span>/<span lang=ZH-CN>连接成功后自动执行一些操作。比较有用的是，写</span>COM<span lang=ZH-CN>时希望</span>VC<span lang=ZH-CN>对编译通过的</span>COM</font><span lang=ZH-CN><font size=3>文件自动注册，可以如下设置：</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><span style="COLOR: #003366"><font face=宋体 size=3>Description: Register COM</font></span></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><span style="COLOR: #003366"><font face=宋体 size=3>Commands: regsvr32 /s /c $(TargetPath) </font></span></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><span style="COLOR: #003366"><font face=宋体 size=3>echo regsvr32 exe.time &gt; $(TargetDir)\$(TargetName).trg</font></span></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><span style="COLOR: #003366"><font face=宋体 size=3>Outputs: $(TargetDir)\$(TargetName).trg</font></span></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%">　</p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><img height=387 src="http://www.vbgamedev.com/newc/VC_Make/21.GIF" width=549 border=0></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>16)<strong>Tools-&gt;Options-&gt;Directories</strong><span lang=ZH-CN>，设置系统的</span>Include<span lang=ZH-CN>、</span>Library</font><span lang=ZH-CN><font size=3>路径。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><strong><font face=宋体 size=3>&nbsp;</font></strong></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><strong><span lang=ZH-CN><font face=宋体 size=3>一些小窍门</font></span></strong></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>1)<span style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal"> </span><span lang=ZH-CN>有时候，你可能在编译的时候，计算机突然非法关机了（可能某人不小心碰了电源或你的内存不稳定等原因）。当你重启机器后打开刚才的项目，重新进行编译，发现</span>VC<span lang=ZH-CN>会崩掉。你或许以为你的</span>VC<span lang=ZH-CN>编译器坏了，其实不然（你试试编译其它项目，还是好的！），你只要将项目的</span>.ncb<span lang=ZH-CN>、</span>.opt<span lang=ZH-CN>、</span>.aps<span lang=ZH-CN>、</span>.clw<span lang=ZH-CN>文件以及</span>Debug<span lang=ZH-CN>、</span>Release<span lang=ZH-CN>目录下的所有文件都删掉，然后重新编译就行了。</span>&nbsp;</font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>2)<span style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal"> </span><span lang=ZH-CN>如果你想与别人共享你的源代码项目，但是把整个项目做拷贝又太大。你完全可以删掉以下文件：</span>.dsw<span lang=ZH-CN>、</span>.ncb<span lang=ZH-CN>、</span>.opt<span lang=ZH-CN>、</span>.aps<span lang=ZH-CN>、</span>.clw<span lang=ZH-CN>、</span>. plg<span lang=ZH-CN>文件以及</span>Debug<span lang=ZH-CN>、</span>Release</font><span lang=ZH-CN><font size=3>目录下的所有文件。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>3)<span style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal"> </span><span lang=ZH-CN>当你的</span>Workspace<span lang=ZH-CN>中包含多个</span>Project<span lang=ZH-CN>的时候，你可能不能直观地、一眼看出来哪个是当前项目。可以如下设置：</span>Tools-&gt;Options-&gt;Format<span lang=ZH-CN>，然后在</span>Category<span lang=ZH-CN>中选择</span>Workspace window<span lang=ZH-CN>，改变其默认的字体（比如设成</span>Fixedsys</font><span lang=ZH-CN><font size=3>）就行了。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>4)<span style="FONT-WEIGHT: normal; FONT-STYLE: normal; FONT-VARIANT: normal"> </span><span lang=ZH-CN>如何给已有的</span>Project<span lang=ZH-CN>改名字？将该</span>Project<span lang=ZH-CN>关掉。然后以文本格式打开</span>.dsp<span lang=ZH-CN>文件，替换原来的</span>Project</font><span lang=ZH-CN><font size=3>名字即可。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><font size=3>5) VC6<span lang=ZH-CN>对类成员的智能提示功能很有用，但有时候会失灵。你可以先关掉项目，将</span>.clw<span lang=ZH-CN>和</span>.ncb<span lang=ZH-CN>删掉，然后重新打开项目，点击菜单项</span>View-&gt;ClassWizard<span lang=ZH-CN>，在弹出的对话框中按一下&#8220;</span>Add All<span lang=ZH-CN>&#8221;按钮；重新</span>Rebuild All</font><span lang=ZH-CN><font size=3>。应该可以解决问题。</font></span></font></p>
<p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%">　</p>
</td>
</tr>
<tr>
    <td width="1038">
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体 size=3>附:</font></p>
    </td>
</tr>
<tr>
    <td width="1038">
    <div id=content>
    <div class=post id=post-88>
    <div class=postTitle>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><strong><font face=宋体 size=3>VC文件扩展名解读大全</font></strong></p>
    </div>
    <div class=postText><font face=宋体 size=3><!-- Content Start --></font>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.APS</font></strong><font size=3>：存放二进制资源的中间文件，VC把当前资源文件转换成二进制格式，并存放在APS文件中，以加快资源装载速度。资源辅助文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.BMP</font></strong><font size=3>：位图资源文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.BSC</font></strong><font size=3>：浏览信息文件，由浏览信息维护工具（BSCMAKE）从原始浏览信息文件（.SBR）中生成，BSC文件可以用来在源代码编辑窗口中进行快速定位。用于浏览项目信息的，如果用source brower的话就必须有这个文件。可以在project options里去掉Generate Browse Info File，这样可以加快编译进度。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.C</font></strong><font size=3>：用C语言编写的源代码文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.CLW</font></strong><font size=3>：ClassWizard</font><font size=3>生成的用来存放类信息的文件。classwizard信息文件，ini文件的格式。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.CNT</font></strong><font size=3>：用来定义帮助文件中&#8220;Contents&#8221;的结构。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.CPP或.CXX</font></strong><font size=3>：用C++语言编写的源代码文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.CUR</font></strong><font size=3>：光标资源文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.DEF</font></strong><font size=3>：模块定义文件，供生成动态链接库时使用。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.DLG</font></strong><font size=3>：定义对话框资源的独立文件。这种文件对于VC工程来说并非必需，因为VC一般把对话框资源放在.RC资源定义文件中。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.DSP</font></strong><font size=3>：VC</font><font size=3>开发环境生成的工程文件，VC4及以前版本使用MAK文件来定义工程。项目文件，文本格式。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.DSW</font></strong><font size=3>：VC</font><font size=3>开发环境生成的WorkSpace文件，用来把多个工程组织到一个WorkSpace中。工作区文件，与.dsp差不多。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.EXP</font></strong><font size=3>：由LIB工具从DEF文件生成的输出文件，其中包含了函数和数据项目的输出信息，LINK工具将使用EXP文件来创建动态链接库。只有在编译DLL时才会生成，记录了DLL文件中的一些信息。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.H、.HPP或.HXX</font></strong><font size=3>：用C/C++语言编写的头文件，通常用来定义数据类型，声明变量、函数、结构和类。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.HLP</font></strong><font size=3>：Windows</font><font size=3>帮助文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.HM</font></strong><font size=3>：在Help工程中，该文件定义了帮助文件与对话框、菜单或其它资源之间ID值的对应关系。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.HPJ</font></strong><font size=3>：由Help Workshop生成的Help工程文件，用来控制Help文件的生成过程。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.HPG</font></strong><font size=3>，生成帮助的文件的工程。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.ICO</font></strong><font size=3>：图标资源文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.ILK</font></strong><font size=3>：连接过程中生成的一种中间文件，只供LINK工具使用。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.INI</font></strong><font size=3>：配置文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.LIB</font></strong><font size=3>：库文件，LINK工具将使用它来连接各种输入库，以便最终生成EXE文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.LIC</font></strong><font size=3>：用户许可证书文件，使用某些ActiveX控件时需要该文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.MAK</font></strong><font size=3>：即MAKE文件，VC4及以前版本使用的工程文件，用来指定如何建立一个工程，VC6把MAK文件转换成DSP文件来处理。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.MAP</font></strong><font size=3>：由LINK工具生成的一种文本文件，其中包含有被连接的程序的某些信息，例如程序中的组信息和公共符号信息等。执行文件的映像信息记录文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.MDP</font></strong><font size=3>：旧版本的项目文件，相当于.dsp</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.NCB</font></strong><font size=3>：NCB</font><font size=3>是&#8220;No Compile Browser&#8221;的缩写，其中存放了供ClassView、WizardBar和Component Gallery使用的信息，由VC开发环境自动生成。无编译浏览文件。当自动完成功能出问题时可以删除此文件。编译工程后会自动生成。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.OBJ</font></strong><font size=3>：由编译器或汇编工具生成的目标文件，是模块的二进制中间文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.ODL</font></strong><font size=3>：用对象描述语言编写的源代码文件，VC用它来生成TLB文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.OLB</font></strong><font size=3>：带有类型库资源的一种特殊的动态链接库，也叫对象库文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.OPT</font></strong><font size=3>：VC</font><font size=3>开发环境自动生成的用来存放WorkSpace中各种选项的文件。工程关于开发环境的参数文件。如工具条位置信息等。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.PBI、.PBO和.PBT</font></strong><font size=3>：由VC的性能分析工具PROFILE生成并使用的三种文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.PCH</font></strong><font size=3>：预编译头文件，比较大，由编译器在建立工程时自动生成，其中存放有工程中已经编译的部分代码，在以后建立工程时不再重新编译这些代码，以便加快整个编译过程的速度。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.PDB</font></strong><font size=3>：程序数据库文件，在建立工程时自动生成，其中存放程序的各种信息，用来加快调试过程的速度。记录了程序有关的一些数据和调试信息。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.PLG</font></strong><font size=3>：编译信息文件，编译时的error和warning信息文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.RC</font></strong><font size=3>：资源定义文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.RC2</font></strong><font size=3>：资源定义文件，供一些特殊情况下使用。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.REG</font></strong><font size=3>：注册表信息文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.RES</font></strong><font size=3>：二进制资源文件，资源编译器编译资源定义文件后即生成RES文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.RTF</font></strong><font size=3>：Rich</font><font size=3> Text Format（丰富文本格式）文档，可由Word或写字板来创建，常被用来生成Help文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.SBR</font></strong><font size=3>：VC</font><font size=3>编译器为每个OBJ文件生成的原始浏览信息文件，浏览信息维护工具（BSCMAKE）将利用SBR文件来生成BSC文件。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.TLB</font></strong><font size=3>：OLE</font><font size=3>库文件，其中存放了OLE自动化对象的数据类型、模块和接口定义，自动化服务器通过TLB文件就能了解自动化对象的使用方法。</font></font></p>
    <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; LINE-HEIGHT: 200%"><font face=宋体><strong><font size=3>.WAV</font></strong><font size=3>：声音资源文件。</font></font></p>
    </div>
    </div>
    </div>
    </td>
<img src ="http://www.cppblog.com/xpzhou/aggbug/25807.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xpzhou/" target="_blank">榕树藤</a> 2007-06-08 10:00 <a href="http://www.cppblog.com/xpzhou/archive/2007/06/08/25807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Select模型</title><link>http://www.cppblog.com/xpzhou/archive/2007/04/25/22786.html</link><dc:creator>榕树藤</dc:creator><author>榕树藤</author><pubDate>Wed, 25 Apr 2007 01:09:00 GMT</pubDate><guid>http://www.cppblog.com/xpzhou/archive/2007/04/25/22786.html</guid><wfw:comment>http://www.cppblog.com/xpzhou/comments/22786.html</wfw:comment><comments>http://www.cppblog.com/xpzhou/archive/2007/04/25/22786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xpzhou/comments/commentRss/22786.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xpzhou/services/trackbacks/22786.html</trackback:ping><description><![CDATA[讲一下套接字模式和套接字I/O模型的区别。先说明一下，只针对Winsock，如果你要骨头里挑鸡蛋把UNIX下的套接字概念来往这里套，那就不关我的事。<br>套接字模式：阻塞套接字和非阻塞套接字。或者叫同步套接字和异步套接字。<br>套接字模型：描述如何对套接字的I/O行为进行管理。<br>Winsock提供的I/O模型一共有五种：<br>select,WSAAsyncSelect,WSAEventSelect,Overlapped,Completion。今天先讲解select。<br><br>1：select模型（选择模型）<br>先看一下下面的这句代码：<br>int iResult = recv(s, buffer,1024);<br>这是用来接收数据的，在默认的阻塞模式下的套接字里，recv会阻塞在那里，直到套接字连接上有数据可读，把数据读到buffer里后recv函数才会返回，不然就会一直阻塞在那里。在单线程的程序里出现这种情况会导致主线程（单线程程序里只有一个默认的主线程）被阻塞,这样整个程序被锁死在这里，如果永远没数据发送过来，那么程序就会被永远锁死。这个问题可以用多线程解决，但是在有多个套接字连接的情况下，这不是一个好的选择，扩展性很差。Select模型就是为了解决这个问题而出现的。<br>再看代码：<br><br>int iResult = ioctlsocket(s, FIOBIO, (unsigned long *)&amp;ul);<br>iResult = recv(s, buffer,1024);<br><br>这一次recv的调用不管套接字连接上有没有数据可以接收都会马上返回。原因就在于我们用ioctlsocket把套接字设置为非阻塞模式了。不过你跟踪一下就会发现，在没有数据的情况下，recv确实是马上返回了，但是也返回了一个错误：WSAEWOULDBLOCK，意思就是请求的操作没有成功完成。看到这里很多人可能会说，那么就重复调用recv并检查返回值，直到成功为止，但是这样做效率很成问题，开销太大。<br>感谢天才的微软工程师吧，他们给我们提供了好的解决办法。<br>先看看select函数<br>int select(<br>int nfds, <br>fd_set FAR *readfds, <br>fd_set FAR *writefds, <br>fd_set FAR *exceptfds, <br>const struct timeval FAR *timeout <br>);<br>第一个参数不要管，会被系统忽略的。第二个参数是用来检查套接字可读性，也就说检查套接字上是否有数据可读，同样，第三个参数用来检查数据是否可以发出。最后一个是检查是否有带外数据可读取。<br>参数详细的意思请去看MSDN，这里限于篇幅不详细解释了。<br>最后一个参数是用来设置select等待多久的，是个结构：<br><br><br>struct timeval {<br>long tv_sec; // seconds <br>long tv_usec; // and microseconds <br>};<br>如果将这个结构设置为(0,0)，那么select函数会马上返回。<br>说了这么久，select的作用到底是什么？<br>他的作用就是：防止在在阻塞模式的套接字里被锁死，避免在非阻塞套接字里重复检查WSAEWOULDBLOCK错误。<br>他的工作流程如下：<br>1：用FD_ZERO宏来初始化我们感兴趣的fd_set，也就是select函数的第二三四个参数。<br>2：用FD_SET宏来将套接字句柄分配给相应的fd_set。<br>3：调用select函数。<br>4：用FD_ISSET对套接字句柄进行检查，如果我们所关注的那个套接字句柄仍然在开始分配的那个fd_set里，那么说明马上可以进行相应的IO操作。比如一个分配给select第一个参数的套接字句柄在select返回后仍然在select第一个参数的fd_set里，那么说明当前数据已经来了，马上可以读取成功而不会被阻塞。<br><br>下面给出一个简单的select模型的服务端套接字。<br><br>#include &#8220;iostream.h&#8221;<br>#include &#8220;winsock2.h&#8221;<br>#include &#8220;windows.h&#8221;<br><br><br>#define InternetAddr "127.0.0.1"<br>#define iPort 5055<br><br>#pragma comment(lib, "ws2_32.lib")<br><br><br>void main()<br>{<br>　　　　WSADATA wsa;<br>　　　　WSAStartup(MAKEWORD(2,2), &amp;wsa);<br>　　　　<br>　　　　SOCKET fdServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);<br>　　　　<br>　　　　struct sockaddr_in server;<br>　　　　server.sin_family = AF_INET;<br>　　　　server.sin_addr.s_addr = inet_addr(InternetAddr);<br>　　　　server.sin_port = htons(iPort);<br>　　　　<br>　　　　int ret = bind(fdServer, (sockaddr*)&amp;server, sizeof(server));<br>　　　　ret = listen(fdServer, 4);<br><br><br>　　　　SOCKET AcceptSocket; <br>　　　　fd_set fdread;<br>　　　　timeval tv;<br>　　　　int nSize; <br><br>　　　　while(1)<br>　　　　{<br>　　　　　　　　<br>　　　　　　　　FD_ZERO(&amp;fdread);//初始化fd_set<br>　　　　　　　　FD_SET(fdServer, &amp;fdread);//分配套接字句柄到相应的fd_set<br>　　　　　　　　<br>　　　　　　　　<br>　　　　　　　　tv.tv_sec = 2;//这里我们打算让select等待两秒后返回，避免被锁死，也避免马上返回<br>　　　　　　　　tv.tv_usec = 0;<br>　　　　　　　　<br>　　　　　　　　select(0, &amp;fdread, NULL, NULL, &amp;tv);<br>　　　　　　　　<br>　　　　　　　　nSize = sizeof(server);<br>　　　　　　　　if (FD_ISSET(fdServer, &amp;fdread))//如果套接字句柄还在fd_set里，说明客户端已经有connect的请求发过来了，马上可以accept成功<br>　　　　　　　　{<br>　　　　　　　　　　　　AcceptSocket = accept(fdServer,( sockaddr*) &amp;server, &amp;nSize);<br>　　　　　　　　　　　　break;<br>　　　　　　　　}<br>　　　　　　　　<br>　　　　　　　　else//还没有客户端的connect请求，我们可以去做别的事，避免像没有用select方式的阻塞套接字程序被锁死的情况，如果没用select,当程序运行到accept的时候客户端恰好没有connect请求，那么程序就会被锁死，做不了任何事情<br>　　　　　　　　{<br>　　　　　　　　　　　　//do something<br>　　　　　　　　　　　　::MessageBox(NULL, "waiting...", "recv", MB_ICONINFORMATION);//别的事做完后，继续去检查是否有客户端连接请求<br>　　　　　　　　}<br>　　　　}<br><br>　　　　char buffer[128];<br>　　　　ZeroMemory(buffer, 128);<br><br>　　　　ret = recv(AcceptSocket,buffer,128,0);//这里同样可以用select，用法和上面一样<br><br>　　　　::MessageBox(NULL, buffer, "recv", MB_ICONINFORMATION);<br><br>　　　　closesocket(AcceptSocket);<br>　　　　WSACleanup();<br>　　　　<br>　　　　return;<br><br>}<br><br>基本上就这样，个人感觉select模型用处不是很大，我只用过一次，去年写端口扫描器的时候用select来检查超时。<br>感觉讲得不是很清楚，虽然东西我很明白，但是要讲解出来讲解得很清楚真不容易。<br>不知道大家能不能看懂，如果看得过程中有什么问题就问吧。<br>
<img src ="http://www.cppblog.com/xpzhou/aggbug/22786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xpzhou/" target="_blank">榕树藤</a> 2007-04-25 09:09 <a href="http://www.cppblog.com/xpzhou/archive/2007/04/25/22786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WinSock学习笔记</title><link>http://www.cppblog.com/xpzhou/archive/2007/04/25/22785.html</link><dc:creator>榕树藤</dc:creator><author>榕树藤</author><pubDate>Wed, 25 Apr 2007 01:08:00 GMT</pubDate><guid>http://www.cppblog.com/xpzhou/archive/2007/04/25/22785.html</guid><wfw:comment>http://www.cppblog.com/xpzhou/comments/22785.html</wfw:comment><comments>http://www.cppblog.com/xpzhou/archive/2007/04/25/22785.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xpzhou/comments/commentRss/22785.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xpzhou/services/trackbacks/22785.html</trackback:ping><description><![CDATA[<strong>与socket有关的一些函数介绍<br><br></strong>1、读取当前错误值：每次发生错误时，如果要对具体问题进行处理，那么就应该调用这个函数取得错误代码。
<pre>      int  WSAGetLastError(void );
#define h_errno   WSAGetLastError()
</pre>
错误值请自己阅读Winsock2.h。<br><br>2、将主机的unsigned long值转换为网络字节顺序(32位)：为什么要这样做呢？因为不同的计算机使用不同的字节顺序存储数据。因此任何从Winsock函数对IP地址和端口号的引用和传给Winsock函数的IP地址和端口号均时按照网络顺序组织的。<br>
<pre>      u_long  htonl(u_long hostlong);
举例：htonl(0)=0
htonl(80)= 1342177280
</pre>
3、将unsigned long数从网络字节顺序转换位主机字节顺序，是上面函数的逆函数。
<pre>      u_long  ntohl(u_long netlong);
举例：ntohl(0)=0
ntohl(1342177280)= 80
</pre>
4、将主机的unsigned short值转换为网络字节顺序(16位)：原因同2：
<pre>      u_short  htons(u_short hostshort);
举例：htonl(0)=0
htonl(80)= 20480
</pre>
5、将unsigned short数从网络字节顺序转换位主机字节顺序，是上面函数的逆函数。
<pre>      u_short  ntohs(u_short netshort);
举例：ntohs(0)=0
ntohsl(20480)= 80
</pre>
6、将用点分割的IP地址转换位一个in_addr结构的地址，这个结构的定义见笔记(一)，实际上就是一个unsigned long值。计算机内部处理IP地址可是不认识如192.1.8.84之类的数据。
<pre>      unsigned long  inet_addr( const char FAR * cp );
举例：inet_addr("192.1.8.84")=1409810880
inet_addr("127.0.0.1")= 16777343
</pre>
如果发生错误，函数返回INADDR_NONE值。<br><br>7、将网络地址转换位用点分割的IP地址，是上面函数的逆函数。
<pre>      char FAR *  inet_ntoa( struct in_addr in );
举例：char * ipaddr=NULL;
char addr[20];
in_addr inaddr;
inaddr. s_addr=16777343;
ipaddr= inet_ntoa(inaddr);
strcpy(addr,ipaddr); </pre>
这样addr的值就变为127.0.0.1。<br>注意意不要修改返回值或者进行释放动作。如果函数失败就会返回NULL值。<br><br>8、获取套接字的本地地址结构：
<pre>      int  getsockname(SOCKET s, struct sockaddr FAR * name, int FAR * namelen );
s为套接字
name为函数调用后获得的地址值
namelen为缓冲区的大小。
</pre>
9、获取与套接字相连的端地址结构：<br>
<pre>      int  getpeername(SOCKET s, struct sockaddr FAR * name, int FAR * namelen );
s为套接字
name为函数调用后获得的端地址值
namelen为缓冲区的大小。
</pre>
10、获取计算机名：<br>
<pre>      int  gethostname( char FAR * name, int namelen );
name是存放计算机名的缓冲区
namelen是缓冲区的大小
用法：
char szName[255];
memset(szName,0,255);
if(gethostname(szName,255)==SOCKET_ERROR)
{
//错误处理
}
返回值为：szNmae="xiaojin"
</pre>
11、根据计算机名获取主机地址：
<pre>      struct hostent FAR *  gethostbyname( const char FAR * name );
name为计算机名。
用法：
hostent * host;
char* ip;
host= gethostbyname("xiaojin");
if(host-&gt;h_addr_list[0])
{
struct in_addr addr;
memmove(&amp;addr, host-&gt;h_addr_list[0]，4);
//获得标准IP地址
ip=inet_ ntoa (addr);
}
返回值为：hostent-&gt;h_name="xiaojin"
hostent-&gt;h_addrtype=2    //AF_INET
hostent-&gt;length=4
ip="127.0.0.1"
</pre>
<img src="http://www.vckbase.com/document/image/paragraph.gif"><strong> Winsock 的I/O操作：</strong><br><br>1、 两种I/O模式
<ul>
    <li>阻塞模式：执行I/O操作完成前会一直进行等待，不会将控制权交给程序。套接字 默认为阻塞模式。可以通过多线程技术进行处理。
    <li>非阻塞模式：执行I/O操作时，Winsock函数会返回并交出控制权。这种模式使用 起来比较复杂，因为函数在没有运行完成就进行返回，会不断地返回 WSAEWOULDBLOCK错误。但功能强大。</li>
</ul>
为了解决这个问题，提出了进行I/O操作的一些I/O模型,下面介绍最常见的三种：<br><br>2、select模型：<br><br>　　通过调用select函数可以确定一个或多个套接字的状态，判断套接字上是否有数据，或<br>者能否向一个套接字写入数据。
<pre>      int  select( int nfds, fd_set FAR * readfds, fd_set FAR * writefds,&nbsp;
fd_set FAR *exceptfds, const struct timeval FAR * timeout );
</pre>
◆先来看看涉及到的结构的定义：<br>a、 d_set结构：<br>
<pre>#define FD_SETSIZE 64?
typedef struct fd_set {
u_int fd_count; /* how many are SET? */
SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
} fd_set;      </pre>
fd_count为已设定socket的数量<br>fd_array为socket列表，FD_SETSIZE为最大socket数量，建议不小于64。这是微软建<br>议的。<br><br>B、timeval结构：
<pre>struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* and microseconds */
};
</pre>
tv_sec为时间的秒值。<br>tv_usec为时间的毫秒值。<br>这个结构主要是设置select()函数的等待值，如果将该结构设置为(0,0)，则select()函数<br>会立即返回。<br><br>◆再来看看select函数各参数的作用：
<ol>
    <li>nfds：没有任何用处，主要用来进行系统兼容用，一般设置为0。<br>
    <li>readfds：等待可读性检查的套接字组。<br>
    <li>writefds；等待可写性检查的套接字组。<br>
    <li>exceptfds：等待错误检查的套接字组。<br>
    <li>timeout：超时时间。<br>
    <li>函数失败的返回值：调用失败返回SOCKET_ERROR,超时返回0。</li>
</ol>
readfds、writefds、exceptfds三个变量至少有一个不为空，同时这个不为空的套接字组<br>种至少有一个socket，道理很简单，否则要select干什么呢。 举例：测试一个套接字是否可读：
<pre>fd_set fdread;
//FD_ZERO定义
// #define FD_ZERO(set) (((fd_set FAR *)(set))-&gt;fd_count=0)
FD_ZERO(&amp;fdread);
FD_SET(s,&amp;fdread)； //加入套接字，详细定义请看winsock2.h
if(select(0,%fdread,NULL,NULL,NULL)&gt;0
{
//成功
if(FD_ISSET(s,&amp;fread) //是否存在fread中，详细定义请看winsock2.h
{
//是可读的
}
}</pre>
<p align=left>◆I/O操作函数：主要用于获取与套接字相关的操作参数。 </p>
<pre> int  ioctlsocket(SOCKET s, long cmd, u_long FAR * argp );     </pre>
s为I/O操作的套接字。<br>cmd为对套接字的操作命令。<br>argp为命令所带参数的指针。<br><br>常见的命令：
<pre>//确定套接字自动读入的数据量
#define FIONREAD _IOR(''''f'''', 127, u_long) /* get # bytes to read */
//允许或禁止套接字的非阻塞模式，允许为非0，禁止为0
#define FIONBIO _IOW(''''f'''', 126, u_long) /* set/clear non-blocking i/o */
//确定是否所有带外数据都已被读入
#define SIOCATMARK _IOR(''''s'''', 7, u_long) /* at oob mark? */
</pre>
3、WSAAsynSelect模型：<br>WSAAsynSelect模型也是一个常用的异步I/O模型。应用程序可以在一个套接字上接收以<br>WINDOWS消息为基础的网络事件通知。该模型的实现方法是通过调用WSAAsynSelect函<br>数 自动将套接字设置为非阻塞模式，并向WINDOWS注册一个或多个网络时间，并提供一<br>个通知时使用的窗口句柄。当注册的事件发生时，对应的窗口将收到一个基于消息的通知。<br>
<pre>      int  WSAAsyncSelect( SOCKET s, HWND hWnd, u_int wMsg, long lEvent);       </pre>
s为需要事件通知的套接字<br>hWnd为接收消息的窗口句柄<br>wMsg为要接收的消息<br>lEvent为掩码，指定应用程序感兴趣的网络事件组合，主要如下：
<pre>#define FD_READ_BIT 0
#define FD_READ (1 &lt;&lt; FD_READ_BIT)
#define FD_WRITE_BIT 1
#define FD_WRITE (1 &lt;&lt; FD_WRITE_BIT)
#define FD_OOB_BIT 2
#define FD_OOB (1 &lt;&lt; FD_OOB_BIT)
#define FD_ACCEPT_BIT 3
#define FD_ACCEPT (1 &lt;&lt; FD_ACCEPT_BIT)
#define FD_CONNECT_BIT 4
#define FD_CONNECT (1 &lt;&lt; FD_CONNECT_BIT)
#define FD_CLOSE_BIT 5
#define FD_CLOSE (1 &lt;&lt; FD_CLOSE_BIT)
</pre>
用法：要接收读写通知：
<pre>int nResult= WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE)；
if(nResult==SOCKET_ERROR)
{
//错误处理
}
</pre>
取消通知：<br>
<pre>      int nResult= WSAAsyncSelect(s,hWnd,0，0)；
</pre>
当应用程序窗口hWnd收到消息时，wMsg.wParam参数标识了套接字，lParam的低字标明<br>了网络事件，高字则包含错误代码。<br><br>4、WSAEventSelect模型<br>WSAEventSelect模型类似WSAAsynSelect模型，但最主要的区别是网络事件发生时会被发<br>送到一个事件对象句柄，而不是发送到一个窗口。<br><br>使用步骤如下：<br>a、 创建事件对象来接收网络事件：<br>
<pre>#define WSAEVENT HANDLE
#define LPWSAEVENT LPHANDLE
WSAEVENT WSACreateEvent( void );
</pre>
该函数的返回值为一个事件对象句柄，它具有两种工作状态：已传信(signaled)和未传信<br>(nonsignaled)以及两种工作模式：人工重设(manual reset)和自动重设(auto reset)。默认未<br>未传信的工作状态和人工重设模式。<br><br>b、将事件对象与套接字关联，同时注册事件，使事件对象的工作状态从未传信转变未<br>已传信。<br>
<pre>      int  WSAEventSelect( SOCKET s,WSAEVENT hEventObject,long lNetworkEvents );  </pre>
s为套接字<br>hEventObject为刚才创建的事件对象句柄<br>lNetworkEvents为掩码，定义如上面所述<br><br>c、I/O处理后，设置事件对象为未传信
<pre>BOOL WSAResetEvent( WSAEVENT hEvent );</pre>
<p>Hevent为事件对象<br><br>成功返回TRUE，失败返回FALSE。<br><br>d、等待网络事件来触发事件句柄的工作状态：</p>
<pre>DWORD WSAWaitForMultipleEvents( DWORD cEvents,
const WSAEVENT FAR * lphEvents, BOOL fWaitAll,
DWORD dwTimeout, BOOL fAlertable );</pre>
<p>lpEvent为事件句柄数组的指针<br>cEvent为为事件句柄的数目，其最大值为WSA_MAXIMUM_WAIT_EVENTS&nbsp;<br>fWaitAll指定等待类型：TRUE：当lphEvent数组重所有事件对象同时有信号时返回；<br>FALSE：任一事件有信号就返回。<br>dwTimeout为等待超时（毫秒）<br>fAlertable为指定函数返回时是否执行完成例程<br><br>对事件数组中的事件进行引用时，应该用WSAWaitForMultipleEvents的返回值，减去<br>预声明值WSA_WAIT_EVENT_0，得到具体的引用值。例如：</p>
<pre>nIndex=WSAWaitForMultipleEvents(&#8230;);
MyEvent=EventArray[Index- WSA_WAIT_EVENT_0];</pre>
<p>e、判断网络事件类型：</p>
<pre>int WSAEnumNetworkEvents( SOCKET s,
WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents );</pre>
<p>s为套接字<br>hEventObject为需要重设的事件对象<br>lpNetworkEvents为记录网络事件和错误代码，其结构定义如下：</p>
<pre>typedef struct _WSANETWORKEVENTS {
long lNetworkEvents;
int iErrorCode[FD_MAX_EVENTS];
} WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS;</pre>
<p>f、关闭事件对象句柄：</p>
<pre>BOOL WSACloseEvent(WSAEVENT hEvent);</pre>
<p>调用成功返回TRUE，否则返回FALSE。<br></p>
<img src ="http://www.cppblog.com/xpzhou/aggbug/22785.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xpzhou/" target="_blank">榕树藤</a> 2007-04-25 09:08 <a href="http://www.cppblog.com/xpzhou/archive/2007/04/25/22785.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pragma指令简介</title><link>http://www.cppblog.com/xpzhou/archive/2007/04/18/22193.html</link><dc:creator>榕树藤</dc:creator><author>榕树藤</author><pubDate>Wed, 18 Apr 2007 02:24:00 GMT</pubDate><guid>http://www.cppblog.com/xpzhou/archive/2007/04/18/22193.html</guid><wfw:comment>http://www.cppblog.com/xpzhou/comments/22193.html</wfw:comment><comments>http://www.cppblog.com/xpzhou/archive/2007/04/18/22193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xpzhou/comments/commentRss/22193.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xpzhou/services/trackbacks/22193.html</trackback:ping><description><![CDATA[在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作.<br>&nbsp;下面介绍了一下该指令的一些常用参数,希望对大家有所帮助!
<p>&nbsp;一. message 参数。<br>&nbsp;message<br>&nbsp;它能够在编译信息输出窗口中输出相应的信息，这对于源代码信息的控制是非常重要的。</p>
<p>&nbsp;其使用方法为：&nbsp; #pragma message("消息文本")</p>
<p>&nbsp;当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。<br>&nbsp;当我们在程序中定义了许多宏来控制源代码版本的时候，我们自己有可能都会忘记有没有正确的设置这些宏，此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法：<br>#ifdef _X86<br>#pragma message("_X86 macro activated!")<br>#endif<br>&nbsp;当我们定义了_X86这个宏以后，应用程序在编译时就会在编译输出窗口里显示<br>&nbsp;"_X86 macro activated!"<br>&nbsp;这样，我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。</p>
<p>&nbsp;二. 另一个使用得比较多的#pragma参数是code_seg。<br>&nbsp;格式如：<br>&nbsp;#pragma code_seg( [ [ { push | pop}, ] [ identifier, ] ] [ "segment-name" [, "segment-class" ] )<br>&nbsp;该指令用来指定函数在.obj文件中存放的节,观察OBJ文件可以使用VC自带的dumpbin命令行程序,函数在.obj文件中默认的存放节为.text节，如果code_seg没有带参数的话,则函数存放在.text节中。</p>
<p>&nbsp;push (可选参数) 将一个记录放到内部编译器的堆栈中,可选参数可以为一个标识符或者节名<br>&nbsp;pop(可选参数) 将一个记录从堆栈顶端弹出,该记录可以为一个标识符或者节名<br>&nbsp;identifier (可选参数) 当使用push指令时,为压入堆栈的记录指派的一个标识符,当该标识符被删除的时候和其相关的堆栈中的记录将被弹出堆栈<br>&nbsp;&nbsp;&nbsp;"segment-name" (可选参数) 表示函数存放的节名<br>&nbsp;例如:<br>&nbsp;//默认情况下,函数被存放在.text节中<br>&nbsp;void func1() {&nbsp;&nbsp;&nbsp;// stored in .text<br>&nbsp;}</p>
<p>&nbsp;//将函数存放在.my_data1节中<br>&nbsp;#pragma code_seg(".my_data1")<br>&nbsp;void func2() {&nbsp;&nbsp;&nbsp;// stored in my_data1<br>&nbsp;}</p>
<p>&nbsp;//r1为标识符,将函数放入.my_data2节中<br>&nbsp;#pragma code_seg(push, r1, ".my_data2")<br>&nbsp;void func3() {&nbsp;&nbsp;&nbsp;// stored in my_data2<br>&nbsp;}</p>
<p>&nbsp;int main() {<br>&nbsp;}</p>
<p>&nbsp;三. #pragma once (比较常用）<br>&nbsp;这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次</p>
<p>&nbsp;四. #pragma hdrstop表示预编译头文件到此为止，后面的头文件不进行预编译。<br>&nbsp;BCB可以预编译头文件以加快链接的速度，但如果所有头文件都进行预编译又可能占太多磁盘空间，所以使用这个选项排除一些头文件。<br>&nbsp;有时单元之间有依赖关系，比如单元A依赖单元B，所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级，如果使用了#pragma package(smart_init) ，BCB就会根据优先级的大小先后编译。</p>
<p>&nbsp;五. #pragma warning指令<br>&nbsp;该指令允许有选择性的修改编译器的警告消息的行为<br>&nbsp;指令格式如下:<br>&nbsp;#pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...]<br>&nbsp;#pragma warning( push[ ,n ] )<br>&nbsp;#pragma warning( pop )</p>
<p>&nbsp;主要用到的警告表示有如下几个:</p>
<p>&nbsp;once:只显示一次(警告/错误等)消息<br>&nbsp;default:重置编译器的警告行为到默认状态<br>&nbsp;1,2,3,4:四个警告级别<br>&nbsp;disable:禁止指定的警告信息<br>&nbsp;error:将指定的警告信息作为错误报告</p>
<p>&nbsp;如果大家对上面的解释不是很理解,可以参考一下下面的例子及说明</p>
<p>&nbsp;#pragma warning( disable : 4507 34; once : 4385; error : 164 )<br>&nbsp;等价于：<br>&nbsp;#pragma warning(disable:4507 34)&nbsp; // 不显示4507和34号警告信息<br>&nbsp;#pragma warning(once:4385)&nbsp;&nbsp; // 4385号警告信息仅报告一次<br>&nbsp;#pragma warning(error:164)&nbsp;&nbsp; // 把164号警告信息作为一个错误。<br>&nbsp;同时这个pragma warning 也支持如下格式：<br>&nbsp;#pragma warning( push [ ,n ] )<br>&nbsp;#pragma warning( pop )<br>&nbsp;这里n代表一个警告等级(1---4)。<br>&nbsp;#pragma warning( push )保存所有警告信息的现有的警告状态。<br>&nbsp;#pragma warning( push, n)保存所有警告信息的现有的警告状态，并且把全局警告等级设定为n。<br>&nbsp;#pragma warning( pop )向栈中弹出最后一个警告信息，在入栈和出栈之间所作的一切改动取消。例如：<br>&nbsp;#pragma warning( push )<br>&nbsp;#pragma warning( disable : 4705 )<br>&nbsp;#pragma warning( disable : 4706 )<br>&nbsp;#pragma warning( disable : 4707 )<br>&nbsp;#pragma warning( pop )</p>
<p>&nbsp;在这段代码的最后，重新保存所有的警告信息(包括4705，4706和4707)</p>
<p>&nbsp;在使用标准C++进行编程的时候经常会得到很多的警告信息,而这些警告信息都是不必要的提示,所以我们可以使用#pragma warning(disable:4786)来禁止该类型的警告在vc中使用ADO的时候也会得到不必要的警告信息,这个时候我们可以通过#pragma warning(disable:4146)来消除该类型的警告信息</p>
<p>&nbsp;六. pragma comment(...)<br>&nbsp;该指令的格式为：&nbsp; #pragma comment( "comment-type" [, commentstring] )<br>&nbsp;该指令将一个注释记录放入一个对象文件或可执行文件中,comment-type(注释类型):可以指定为五种预定义的标识符的其中一种。<br>&nbsp;五种预定义的标识符为:</p>
<p>&nbsp;1、compiler:将编译器的版本号和名称放入目标文件中,本条注释记录将被编译器忽略<br>如果你为该记录类型提供了commentstring参数,编译器将会产生一个警告<br>例如:#pragma comment( compiler )</p>
<p>&nbsp;2、exestr:将commentstring参数放入目标文件中,在链接的时候这个字符串将被放入到可执行文件中,当操作系统加载可执行文件的时候,该参数字符串不会被加载到内存中.但是,该字符串可以被dumpbin之类的程序查找出并打印出来,你可以用这个标识符将版本号码之类的信息嵌入到可执行文件中!</p>
<p>&nbsp;3、lib:这是一个非常常用的关键字,用来将一个库文件链接到目标文件中常用的lib关键字，可以帮我们连入一个库文件。<br>&nbsp;例如: <br>&nbsp;#pragma comment(lib, "user32.lib")<br>&nbsp;该指令用来将user32.lib库文件加入到本工程中</p>
<p>&nbsp;4、linker:将一个链接选项放入目标文件中,你可以使用这个指令来代替由命令行传入的或者在开发环境中设置的链接选项,你可以指定/include选项来强制包含某个对象,例如:<br>#pragma comment(linker, "/include:__mySymbol")<br>你可以在程序中设置下列链接选项<br>/DEFAULTLIB<br>/EXPORT<br>/INCLUDE<br>/MERGE<br>/SECTION</p>
<p>&nbsp;这些选项在这里就不一一说明了,详细信息请看msdn!</p>
<p>&nbsp;5、user:将一般的注释信息放入目标文件中commentstring参数包含注释的文本信息,这个注释记录将被链接器忽略<br>&nbsp;例如:<br>&nbsp;#pragma comment( user, "Compiled on " __DATE__ " at " __TIME__ ) </p>
<img src ="http://www.cppblog.com/xpzhou/aggbug/22193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xpzhou/" target="_blank">榕树藤</a> 2007-04-18 10:24 <a href="http://www.cppblog.com/xpzhou/archive/2007/04/18/22193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>