**【文章摘要】**
Microsoft Visual C++是微軟公司推出的、在Windows下的可視化集成編程系統,也是廣大軟件工程師使用得比較多的一款編程軟件。本文主要講述Visual C++編譯器常用的選項設置,為大家全面掌握該軟件以進行軟件開發工作提供了有益的參考。
**【關鍵詞】**
Visual C++??選項設置??編譯??調試
### 一、前言
Microsoft Visual C++是Microsoft公司推出的開發Win32環境程序,面向對象的可視化集成編程系統。它不但具有程序框架自動生成、靈活方便的類管理、代碼編寫和界面設計集成交互操作、可開發多種程序等優點,而且通過簡單的設置就可使其生成的程序框架支持數據庫接口、OLE2、WinSock網絡和3D控制界面等。
但是,大多數編程人員只是使用了其基本功能,沒有對之進行深入的了解,如不知道Visual C++編譯器常用選項的設置就是一例。通過閱讀相關資料,作者對Visual C++編譯器常用選項設置進行了總結,希望能夠對大家所從事的研發工作有所幫助。
### 二、 編譯參數的設置
這主要是通過IDE的菜單項“Project->Settings->C/C++”來完成的。如圖1所示。

圖1?“Project Settings”的示意圖1
我們一般通過修改這一頁上的“Category”中的各項來完成編譯參數的設置。“Category”中共有8個選項,包括:General、C++ Language、Code Generation、Customize、Listing Files、Optimizations、Precompiled Headers和Preprocessor。以下分別介紹在每個參數下的配置情況。
1. General
當“Category”一欄選擇“General”時,界面如圖1所示。其它各欄的介紹如表1所示。
表1?“General”下的配置介紹
<table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top" style="background-color:rgb(204,204,204)"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><strong><span style="font-size:18px">名稱</span></strong></p></td><td valign="top" style="background-color:rgb(204,204,204)"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><strong><span style="font-size:18px">功能簡介</span></strong></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Warning level</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">用來控制警告信息,其中<span style="font-family:'Times New Roman'">Level 1</span>是最嚴重的級別。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Optimizations</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">是代碼優化,可以在<span style="font-family:'Times New Roman'">Category</span>的<span style="font-family:'Times New Roman'">Optimizations</span>項中進行更細的設置。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Warnings as errors</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">將警告信息當作錯誤處理。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Generate browse info</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">用以生成<span style="font-family:'Times New Roman'">.sbr</span>文件,記錄類、變量等符號信息,可以在<span style="font-family:'Times New Roman'">Category</span>的<span style="font-family:'Times New Roman'">Listing Files</span>項中進行更多的設置。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Debug info????</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">生成調試信息,包括:</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">1)</span>??????? None:不產生任何調試信息<span style="font-family:'Times New Roman'">(</span>編譯比較快<span style="font-family:'Times New Roman'">)</span>。</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">2)</span>??????? Line Numbers Only:僅生成全局的和外部符號的調試信息到<span style="font-family:'Times New Roman'">.OBJ</span>文件或<span style="font-family:'Times New Roman'">.EXE</span>文件,減小目標文件的尺寸。</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">3)</span>??????? C7 Compatible:記錄調試器用到的所有符號信息到<span style="font-family:'Times New Roman'">.OBJ</span>文件和<span style="font-family:'Times New Roman'">.EXE</span>文件。</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">4)</span>??????? Program Database:創建<span style="font-family:'Times New Roman'">.PDB</span>文件記錄所有調試信息。</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">5)</span>??????? Program Database for "Edit & Continue:創建<span style="font-family:'Times New Roman'">.PDB</span>文件記錄所有調試信息,并且支持調試時編輯。</span></p></td></tr></tbody></table>
2.C++ Language
當“Category”一欄選擇“C++ Language”時,界面如圖2所示。其它各欄的介紹如表2所示。

圖2?“Project Settings”的示意圖2
表2?“C++ Language”下的配置介紹
<table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top" style="background-color:rgb(204,204,204)"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><strong><span style="font-size:18px">名稱</span></strong></p></td><td valign="top" style="background-color:rgb(204,204,204)"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><strong><span style="font-size:18px">功能簡介</span></strong></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Pointer-to-member representation</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">用來設置類定義<span style="font-family:'Times New Roman'">/</span>引用的先后關系,一般為<span style="font-family:'Times New Roman'">Best-Case Always</span>表示在引用類之前該類肯定已經定義了。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Enable Exception Handling</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">進行同步的異常處理。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Enable Run-Time Type Information</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">迫使編譯器增加代碼在運行時進行對象類型檢查。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Disable Construction Displacements</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">設置類構造<span style="font-family:'Times New Roman'">/</span>析構函數調用虛函數問題。</span></p></td></tr></tbody></table>
3.Code Generation
當“Category”一欄選擇“Code Generation”時,界面如圖3所示。其它各欄的介紹如表3所示。

圖3?“Project Settings”的示意圖3
表3?“Code Generation”下的配置介紹
<table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top" style="background-color:rgb(204,204,204)"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><strong><span style="font-size:18px">名稱</span></strong></p></td><td valign="top" style="background-color:rgb(204,204,204)"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><strong><span style="font-size:18px">功能簡介</span></strong></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Processor</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">表示代碼指令優化,可以為<span style="font-family:'Times New Roman'">80386</span>、<span style="font-family:'Times New Roman'">80486</span>、<span style="font-family:'Times New Roman'">Pentium</span>、<span style="font-family:'Times New Roman'">Pentium Pro</span>,或者<span style="font-family:'Times New Roman'">Blend</span>表示混合以上各種優化。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Use run-time library</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">用以指定程序運行時使用的運行時庫<span style="font-family:'Times New Roman'">(</span>單線程或多線程,<span style="font-family:'Times New Roman'">Debug</span>版本或<span style="font-family:'Times New Roman'">Release</span>版本<span style="font-family:'Times New Roman'">)</span>,有一個原則就是,一個進程不要同時使用幾個版本的運行時庫。具體包括:</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">1)</span>??????? Single-Threaded:靜態連接<span style="font-family:'Times New Roman'">LIBC.LIB</span>庫。</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">2)</span>??????? Multithreaded:靜態連接<span style="font-family:'Times New Roman'">LIBCMT.LIB</span>庫。</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">3)</span>??????? Multithreaded DLL:動態連接<span style="font-family:'Times New Roman'">MSVCRT.DLL</span>庫。</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">4)</span>??????? Debug Single-Threaded:靜態連接<span style="font-family:'Times New Roman'">LIBCD.LIB</span>庫。</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">5)</span>??????? Debug Multithreaded:靜態連接<span style="font-family:'Times New Roman'">LIBCMTD.LIB</span>庫。</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">6)</span>??????? Debug Multithreaded DLL:動態連接<span style="font-family:'Times New Roman'">MSVCRTD.DLL</span>庫。連接了單線程庫就不支持多線程調用,連接了多線程庫就要求創建多線程的應用程序。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Calling convention</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">可以用來設定調用約定,有三種:<span style="font-family:'Times New Roman'">__cdecl</span>、<span style="font-family:'Times New Roman'">__fastcall</span>和<span style="font-family:'Times New Roman'">__stdcall</span>。各種調用約定的主要區別在于,函數調用時,函數的參數是從左到右壓入堆棧還是從右到左壓入堆棧;在函數返回時,由函數的調用者來清理壓入堆棧的參數還是由函數本身來清理;以及在編譯時對函數名進行的命名修飾<span style="font-family:'Times New Roman'">(</span>可以通過<span style="font-family:'Times New Roman'">Listing Files</span>看到各種命名修飾方式<span style="font-family:'Times New Roman'">)</span>。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Struct member alignment</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">用以指定數據結構中的成員變量在內存中是按幾字節對齊的,根據計算機數據總線的位數,不同的對齊方式存取數據的速度不一樣。這個參數對數據包網絡傳輸等應用尤為重要,不是存取速度問題,而是數據位的精確定義問題,一般在程序中使用<span style="font-family:'Times New Roman'">#pragma pack</span>來指定。</span></p></td></tr></tbody></table>
4. Customize
當“Category”一欄選擇“Customize”時,界面如圖4所示。其它各欄的介紹如表4所示。

圖4?“Project Settings”的示意圖4
表4?“Customize”下的配置介紹
<table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top" style="background-color:rgb(204,204,204)"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><strong><span style="font-size:18px">名稱</span></strong></p></td><td valign="top" style="background-color:rgb(204,204,204)"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><strong><span style="font-size:18px">功能簡介</span></strong></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Disable Language Extensions</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">表示不使用微軟為標準<span style="font-family:'Times New Roman'">C</span>做的語言擴展。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Enable Function-Level Linking</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">告訴編譯器將各個函數按打包格式編譯。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Eliminate Duplicate Strings</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">主要用于字符串優化<span style="font-family:'Times New Roman'">(</span>將字符串放到緩充池里以節省空間<span style="font-family:'Times New Roman'">)</span>,使用這個參數,使得:</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">char *sBuffer = "This is a character buffer";</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">char *tBuffer = "This is a character buffer";</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">sBuffer</span>和<span style="font-family:'Times New Roman'">tBuffer</span>指向的是同一塊內存空間。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Enables minimal rebuild</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">通過保存關聯信息到<span style="font-family:'Times New Roman'">.IDB</span>文件,使編譯器只對最新類定義改動過的源文件進行重編譯,提高編譯速度。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Enable Incremental Compilation</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">同樣通過<span style="font-family:'Times New Roman'">.IDB</span>文件保存的信息,只重編譯最新改動過的函數。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Suppress Startup Banner and Information Messages</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">用以控制參數是否在<span style="font-family:'Times New Roman'">output</span>窗口輸出。</span></p></td></tr></tbody></table>
5. Listing Files
當“Category”一欄選擇“Listing Files”時,界面如圖5所示。其它各欄的介紹如表5所示。

圖5?“Project Settings”的示意圖5
表5?“Listing Files”下的配置介紹
<table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top" style="background-color:rgb(204,204,204)"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><strong><span style="font-size:18px">名稱</span></strong></p></td><td valign="top" style="background-color:rgb(204,204,204)"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><strong><span style="font-size:18px">功能簡介</span></strong></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Generate browse info</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">其功能上面已經提到過,這里可以進行更多的設置。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Exclude Local Variables from Browse Info</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">表示是否將局部變量的信息放到<span style="font-family:'Times New Roman'">.SBR</span>文件中。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Listing file type</span></p></td><td valign="top"><p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">可以設置生成的列表信息文件的內容:<span style="font-family:'Times New Roman'">Assembly-Only Listing</span>僅生成匯編代碼文件<span style="font-family:'Times New Roman'">(.ASM</span>擴展名<span style="font-family:'Times New Roman'">)</span>,<span style="font-family:'Times New Roman'">Assembly With Machine Code</span>生成機器代碼和匯編代碼文件<span style="font-family:'Times New Roman'">(.COD</span>擴展名<span style="font-family:'Times New Roman'">)</span>,<span style="font-family:'Times New Roman'">Assembly With Source Code</span>生成源代碼和匯編代碼文件<span style="font-family:'Times New Roman'">(.ASM</span>擴展名<span style="font-family:'Times New Roman'">)</span>,<span style="font-family:'Times New Roman'">Assembly, Machine Code,and Source</span>生成機器碼、源代碼和匯編代碼文件<span style="font-family:'Times New Roman'">(.COD</span>擴展名<span style="font-family:'Times New Roman'">)</span>。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Listing file name</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">為生成的信息文件的路徑,一般為<span style="font-family:'Times New Roman'">Debug</span>或<span style="font-family:'Times New Roman'">Release</span>目錄下,生成的文件名自動取源文件的文件名。</span></p></td></tr></tbody></table>
6.Optimizations
當“Category”一欄選擇“Optimizations”時,界面如圖6所示。其它各欄的介紹如表6所示。

圖6?“Project Settings”的示意圖6
表6?“Optimizations”下的配置介紹
<table border="1" cellspacing="0" cellpadding="0"><tbody><tr><td valign="top" style="background-color:rgb(204,204,204)"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">名稱</span></p></td><td valign="top" style="background-color:rgb(204,204,204)"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">功能簡介</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Maximize Speed</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">生成最快速的代碼。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Minimize Size</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">生成最小尺寸的程序。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Customize</span></p></td><td valign="top"><p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">Assume No Aliasing??????</span>不使用別名<span style="font-family:'Times New Roman'">(</span>提高速度<span style="font-family:'Times New Roman'">)</span>;</span></p><p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">Assume Aliasing Across Function Calls?</span>僅函數內部不使用別名;</span></p><p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">Global Optimizations?????</span>全局優化;</span></p><p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">Generate Intrinsic Functions??</span>使用內部函數替換一些函數調用<span style="font-family:'Times New Roman'">(</span>提高速度<span style="font-family:'Times New Roman'">)</span>;</span></p><p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">Improve Float Consistency????</span>浮點運算方面的優化;</span></p><p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">Favor Small Code??</span>程序<span style="font-family:'Times New Roman'">(exe</span>或<span style="font-family:'Times New Roman'">dll)</span>尺寸優化優先于代碼速度優化;</span></p><p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">Frame-Pointer Omission???????</span>不使用幀指針,以提高函數調用速度;</span></p><p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">Full Optimization???</span>組合了幾種參數,以生成最快的程序代碼。</span></p></td></tr><tr><td valign="top"><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">?</span></p><p align="center" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-family:'Times New Roman'; font-size:18px">Inline function expansion</span></p></td><td valign="top"><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px">內聯函數擴展的三種優化<span style="font-family:'Times New Roman'">(</span>使用內聯可以節省函數調用的開銷,加快程序速度<span style="font-family:'Times New Roman'">)</span>:</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">Disable</span>不使用內聯;</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">Only __inline</span>,僅函數定義前有<span style="font-family:'Times New Roman'">inline</span>或<span style="font-family:'Times New Roman'">__inline</span>標記使用內聯;</span></p><p align="left" style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px"><span style="font-size:18px"><span style="font-family:'Times New Roman'">Any Suitable</span>,除了<span style="font-family:'Times New Roman'">inline</span>或<span style="font-family:'Times New Roman'">__inline</span>標記的函數外,編譯器“覺得”應該使用內聯的函數,都使用內聯。</span></p></td></tr></tbody></table>
7.Precompiled Headers
當“Category”一欄選擇“Precompiled Headers”時,界面如圖7所示。

圖7?“Project Settings”的示意圖7
預編譯頭文件的設置。使用預編譯可以提高重復編譯的速度。IDE一般將一些公共的、不大變動的頭文件(比如afxwin.h等)集中放到stdafx.h中,這一部分代碼就不必每次都重新編譯(除非是Rebuild All)。
8.Preprocessor
當“Category”一欄選擇“Preprocessor”時,界面如圖8所示。

圖8?“Project Settings”的示意圖8
可以定義/解除定義一些常量。Additional include directories,可以指定額外的包含目錄,一般是相對于本項目的目錄,如……\\Include。
### 三、 連接參數的設置
這主要是通過IDE的菜單項“Project->Settings->Link”來完成。
1.General
當“Category”一欄選擇“General”時,界面如圖9所示。

圖9?“Project Settings”的示意圖9
可以設置生成的文件路徑、文件名,連接的庫文件等。
Generate debug info:生成Debug信息到.PDB文件(具體格式可以在Category->Debug中設置)。
Ignore All Default Libraries:放棄所有默認的庫連接。
Link Incrementally:通過生成. ILK文件實現遞增式連接以提高后續連接速度,但一般這種方式下生成的文件(EXE或DLL)較大。
Generate Mapfile:生成.MAP文件記錄模塊相關信息。
Enable Profiling:這個參數通常與Generate Mapfile參數同時使用,而且如果產生Debug信息的話,不能用.PDB文件,而且必須用Microsoft Format。
2.Customize
當“Category”一欄選擇“Customize”時,界面如圖10所示。

圖10?“Project Settings”的示意圖10
在這里可以進行使用程序數據庫文件的設置。
Force File Output:強制產生輸出文件(EXE或DLL)。
Print Progress Messages:可以將連接過程中的進度信息輸出到Output窗口。
3. Debug
當“Category”一欄選擇“Debug”時,界面如圖11所示。

圖11?“Project Settings”的示意圖11
在這里設置是否生成調試信息,以及調試信息的格式。
格式可以有Microsoft Format、COFF Format(Common Object File Format)和Both Formats三種選擇。
Separate Types表示將Debug格式信息以獨立的.PDB文件存放,還是直接放在各個源文件的.PDB文件中。選中的話,表示采用后者的方式,這種方式調試啟動比較快。
4.Input
當“Category”一欄選擇“Input”時,界面如圖12所示。

圖12?“Project Settings”的示意圖12
這里可以指定要連接的庫文件和放棄連接的庫文件等。
還可以增加額外的庫文件目錄,一般是相對于本項目的目錄,如..\Lib。
Force Symbol References可以指定連接特定符號定義的庫。
5.Output
當“Category”一欄選擇“Output”時,界面如圖13所示。

圖13?“Project Settings”的示意圖13
Base Address可以改變程序默認的基地址(EXE文件默認為0x400000,DLL默認為x10000000),操作系統裝載一個程序時總是試著先從這個基地址開始。
Entry-Point Symbol可以指定程序的入口地址,一般為一個函數名(且必須采用__stdcall調用約定)。一般Win32的程序,EXE的入口為WinMain,DLL的入口為DllEntryPoint;最好讓連接器自動設置程序的入口點。默認情況下,通過一個C的運行時庫函數來實現:控制臺程序采用mainCRTStartup(或wmainCRTStartup)去調用程序的main(或wmain)函數;Windows程序采用WinMainCRTStartup(或?wWinMainCRTStartup)調用程序的WinMain(或wWinMain,必須采用__stdcall調用約定);DLL采用_DllMainCRTStartup調用DllMain函數(必須采用__stdcall調用約定)。
Stack allocations,用以設置程序使用的堆棧大小(請使用十進制),默認為1兆字節。
Version Information告訴連接器在EXE或DLL文件的開始部分放上版本號。
值得注意的是,上面各個參數是大小寫敏感的;在參數后加上“-”表示該參數無效;各個參數值選項有“*”的表示為該參數的默認值;可以使用頁右上角的“Reset”按鈕來恢復該頁的所有默認設置。
### 四、其它一些參數設置
1.Project->Settings->General
界面如圖14所示。

圖14?“Project Settings”的示意圖14
可以設置連接MFC庫的方式(靜態或動態)。如果是動態連接,在軟件發布時不要忘了帶上MFC的DLL。
2.Project->Settings->Debug
界面如圖15所示。

圖15?“Project Settings”的示意圖15
可以設置調試時運行的可執行文件,以及命令行參數等。
3.Project->Settings->Custom Build
界面如圖16所示。

圖16?“Project Settings”的示意圖16
可以設置編譯/連接成功后自動執行一些操作。比較有用的是,寫COM時希望IDE對編譯通過的COM文件自動注冊,可以如下設置:
Description: Register COM
Commands: regsvr32 /s /c $(TargetPath)
echo regsvr32 exe.time > $(TargetDir)\$(TargetName).trg
Outputs: $(TargetDir)\$(TargetName).trg
4.Tools->Options->Directories
界面如圖17所示。

圖17?“Options”的示意圖
設置系統的Include、Library路徑。
### 五、一些小竅門(針對Visual C++)
1.有時候,可能在編譯的時候,計算機突然非法關機了(可能是某人不小心碰了電源或你的內存不穩定等原因所致)。當重啟機器后打開剛才的項目,重新進行編譯,發現IDE會崩掉。你或許以為你的編譯器壞了,其實不然(你試試編譯其它項目,還是好的!),這時只要將項目的.ncb、.opt、.aps、.clw文件以及Debug、Release目錄下的所有文件都刪掉,然后重新編譯就行了。
2.如果你想與別人共享你的源代碼項目,但是把整個項目做拷貝又太大。你完全可以刪掉以下文件:.dsw、.ncb、.opt、.aps、.clw、. plg文件以及Debug、Release目錄下的所有文件。
3.當你的Workspace中包含多個Project的時候,你可能不能直觀地、一眼看出來哪個是當前項目。可以如下設置:Tools->Options->Format,然后在Category中選擇Workspace window,改變其默認的字體(比如設成Fixedsys)就行了。
4.如何給已有的Project改名字?將該Project關掉,然后以文本格式打開.dsp文件,替換原來的Project名字即可。
5.VC6對類成員的智能提示功能很有用,但有時候會失靈。你可以先關掉項目,將.clw和.ncb刪掉,然后重新打開項目,點擊菜單項View->ClassWizard,在彈出的對話框中按一下“Add All”按鈕,重新Rebuild All。
### 六、總結
“工欲善其事,必先利其器”,熟練掌握工具的用法是對軟件工程師的基本要求。在本人剛接手項目的時候,對于Visual C++不是很熟悉,導致被一位老工程師問得摸不著頭腦。后來,我上網查了一點資料,發現自己以前對于Visual C++知之甚少。雖然現在很多開發工程師不用該軟件編程,但了解其用法對于開發工程師還是很有好處的。
希望該文能夠對大家有所裨益。
### 七、參考資料
1.Visual C++編譯器常用選項設置,[http://developer.51cto.com/art/200901/106017.htm](http://developer.51cto.com/art/200901/106017.htm)。
2.Microsoft Visual C++,[http://baike.baidu.com/view/100377.htm](http://baike.baidu.com/view/100377.htm)。