一.IDE基礎配置
1. 字型
VC6中“Tools→Options→Format→Font”配置字型;VC2005中“工具→選項→環境→字型和顔色”配置字型。
編寫代碼一般采用等寬字型,等寬點陣(位圖)字型,相對矢量字型而言具有相容性好和顯示清晰的優點。常用的程式設計等寬字型包括Fixedsys(VC6和notepad禦用字型)、Consolas、YaHei Mono。
VC6預設可選字型隻有Fixedsys和Terminal,可通過修改系統資料庫來改字型,在HKEY_CURRENT_USER/Software/Microsoft/DevStudio/6.0/Format下面有幾個子鍵,可以修改Source Window鍵的FontFace和FontSize來配置源代碼視窗的顯示字型。例如設定11号的Consolas字型:FontFace=Consolas,FontSize=11。
2. 制表符(TAB)
程式塊要采用縮進風格編寫,IDE碰到左括号換行的情況一般會自動縮進(Auto Indent),縮進的空格數和制表符的寬度一般設為4個半角字元。由于不同的編輯器對TAB空格數的設定可能不一樣,有的是4有的是8,為避免使用不同的編輯器閱讀程式時的布局不整齊問題,建議隻使用空格鍵對齊。
VC6中“Tools→Options→Tabs”的“Insert spaces/Keep tabs”中選擇“Insert spaces”;VC2005中“工具→選項→文本編輯器→所有語言→制表符”可配置制表符大小(Tab Size)/縮進大小(Indent Size)為4,對“插入空格/保留制表符”勾選“插入空格”。
3. 行代碼字元數
關于一行編寫多少代碼換行比較合适的問題,可以在VC中輸入一行”//”即可得知,一般為75或80。
4.外接插件和外部工具
外接插件能擴充Visual Studio的功能,例如VC6預設并無行号顯示功能,可以使用VC6LineNumberAddin插件實作顯示行号,“Tools -> Customize→Add-ins and Macro Files”選擇“Browse”進VC6LineNumberAddin.dll即可加載使用。我們在VC2005的“工具→外接程式管理器”中可以看到安裝的“Visual Assist X”插件,并可選擇啟用與否。
以下為AStyle的配置:
标題:AStyle
指令:C:/Program Files/Microsoft Visual Studio 8/Common7/Tools/AStyle.exe
參數:--style=ansi $(ItemFileName)$(ItemExt)
初始目錄:$(ItemDir)
勾選“使用輸出視窗”。
這樣,“工具菜單”中新增一個“AStyle”的子項,點選“AStyle”即可按ANSI風格格式化目前檔案代碼。
5. IDE指定和打開多個項目
Q1:安裝VS2005後,之前的VC6預設打開程式和圖示都變更為VC2005的風格。如何恢複至VC6的預設風格呢?
A1:工具→檔案夾選項→檔案類型(Win7中是設定預設程式)
找到DSW檔案,進階(可能先還原)→編輯,用于執行操作的應用程式由"C:/Program Files/Microsoft Visual Studio 8/Common7/IDE/devenv.exe" "%1"更改為"C:/Program Files/Microsoft Visual Studio/Common/MSDev98/Bin/MSDEV.EXE" "%1",這樣預設*.dsw檔案就以VC6.0打開,而不是以VC8.0打開。同樣更改*.dsp檔案類型以用VC6打開,當然可以更改顯示圖示為VC6風格的。
Q2:輕按兩下VC項目檔案(*.sln/*.dsw),并沒有打開一個新的IDE視窗,而是替代了已經打開的項目。
A2:工具→檔案夾選項→檔案類型(Win7中是設定預設程式)
找到DSW/SLN檔案,進階(可能先還原)→編輯,勾掉“使用DDE”。
二.預處理宏
1. 通用宏
VC6.0中:
Project Setting→C/C++→Preprocessor definitions
VC2005中:
項目屬性→配置屬性→C/C++→預處理器定義
(1)平台識别宏
WIN32:指明是Window 32位系統平台。
常見的平台識别宏如下:
_DOS_:MS-DOS 16位系統平台。
WIN64:指明是Window 64位系統平台。
_WIN32_WCE:Window Mobile 32位系統平台。
_UNIX:UNIX系統平台。
_POSIX_:POSIX(Portable Operating System Interface of Unix)系統平台。
_LINUX_:LINUX系統平台。
_APPLE_/_MAC_:蘋果(Macintosh)系統平台。
(2)字元集識别宏
_MBCS/_UNICODE:指明該工程使用的字元集(多位元組字元集/UNICODE)。
在VC6.0的“Project Setting→C/C++→Project Options”處将會有/D "_MBCS"或/D "_UNICODE"開關。
在VC2005的“項目屬性→配置屬性→正常→項目預設值→字元集”中選擇“使用多位元組字元集”或“使用 Unicode 字元集”;在“項目屬性→配置屬性→C/C++→使用UNICODE響應檔案”中選擇“是”或“否”。在“項目屬性→配置屬性→C/C++→指令行” 處将會有/D "_MBCS"或/D "_UNICODE" /D "UNICODE"開關。
當項目中的檔案具有 UNICODE 路徑(例如中文路徑)時,應在“項目屬性→C/C++→正常”和“項目屬性→連結器→正常”中開啟“使用UNICODE響應檔案”開關。
(3)UI識别宏
_CONSOLE/_WINDOWS:指明應用程式的類型是控制台程式或視窗程式(CUI/GUI)。
(4)debug/release版本識别宏
_DEBUG/NDEBUG:指明編譯版本(Debug/Release)。
2.項目類型特定宏
VC不同的項目類型,有一些特定的宏,以在編譯器區分項目類型。
(1)Win32 Static Library項目
Project Setting→C/C++(Category:General)→Preprocessor definitions:_LIB
如果選擇了MFC Support則_WINDOWS,_AFXDLL
項目屬性→正常→配置類型→靜态庫(.lib)
項目屬性→C/C++→預處理器→預處理器定義:_LIB
(2)Win32 Dynamic-Link Library項目
Project Setting→C/C++→Preprocessor definitions:_WINDOWS,_USRDLL,DLL_EXPORTS
項目屬性→正常→配置類型→動态庫(.dll)
項目屬性→C/C++→預處理器→預處理器定義:_WINDOWS;_USRDLL;DLL_EXPORTS
(3)MFC DLL項目
<1>Regular DLL with MFC statically linked(帶靜态連結MFC的規則DLL)
Project Setting→C/C++→Preprocessor definitions:_WINDOWS,_WINDLL,_USRDLL
項目屬性→C/C++→預處理器→預處理器定義:_WINDOWS;_USRDLL
<2>Regular DLL using shared MFC DLL(使用共享MFC DLL的規則DLL)
Project Setting→C/C++→Preprocessor definitions:_WINDOWS,_WINDLL,_AFXDLL, _USRDLL
<3>MFC Extension DLL(using shared MFC DLL)(MFC擴充DLL)
Project Setting→C/C++→Preprocessor definitions:_WINDOWS,_WINDLL,_AFXDLL,_USRDLL
項目屬性→C/C++→預處理器→預處理器定義:_WINDOWS; _AFXEXT
在DLL項目中,_USRDLL宏表示生成Export Lib!
3.其他常用宏
__FILE__/__LINE__:
__FILE__為包含目前程式檔案名的路徑字元串,例如C:/Program Files/Microsoft Visual Studio/VC98/INCLUDE/stdio.h;__LINE__為目前程式代碼行号,從1開始的整數。
__STDC__/__cplusplus:
當編譯标準C (ANSI C)程式時,編譯器自動定義__STDC__ ;當編譯标準C++ 程式時,編譯器自動定義__cplusplus。
關于VC編譯器預處理宏,參考:
三.工作目錄和控制台程式運作參數
“Project Setting→Debug→Working directory”處填寫exe程式的工作目錄。
在“Project Setting→Debug→Program argument”處填寫main運作參數。
在“項目屬性→配置屬性→調試→工作目錄”處填寫exe程式的工作目錄。
在“項目屬性→配置屬性→調試→指令參數”處填寫main運作參數。
預設的工作目錄為ProjectDir,即*.dsp/*.vcproj所在目錄。
通過編譯器啟動(Ctrl + F5)應用程式時,可以将所依賴的lib和dll庫檔案所在目錄設為工作目錄。應用程式執行期間,檔案操作的預設路徑為工作目錄。
工作目錄是指目前目錄,GetCurrentDirectory()得到的路徑;SetCurrentDirectory來改變。
運作目錄是指exe所在路徑,可通過GetModuleFileName()得到。
四.附加頭檔案包含
VC6.0預設include包含路徑:Tools→Options→Directories→Include files。
對于特定項目的頭檔案包含,在“Project Setting→C/C++(Category:Preprocessor)→Additional include directories”處添加附加頭檔案目錄,相對目錄參考*.dsp檔案。
目錄路徑不需添加雙引号,路徑分隔符為’/’或’/’,不必考慮反斜杠’/’的轉義。多個路徑之間以逗号分隔。
相應的在“Project Setting→C/C++→Project Options”中将會出現“/I”的包含指令。
VC2005預設include包含路徑:工具→選項→項目和解決方案→VC++目錄→包含檔案。
對于特定項目的頭檔案包含,在“項目屬性→配置屬性→C/C++→正常→附加包含目錄”處添加附加包含目錄,相對目錄參考$ProjectPath(*.vcproj檔案路徑)。
目錄路徑不需添加雙引号,路徑分隔符為’/’或’/’,不必考慮反斜杠’/’的轉義。多個路徑之間以分号分隔。
相應的在“項目屬性→配置屬性→C/C++→指令行” 中将會出現“/I”的包含指令。
關于#include的兩種包含方式
#include <std*.h>為編譯器指定的包含路徑下的頭檔案:即在VC6.0中的“Tools→Options→Directories→Include files”(對應VC2005的“工具→選項→項目和解決方案→VC++目錄→包含檔案”)處指定的包含目錄。預設情況下包括
(1)$(VCInstallDir)include(/Microsoft Visual Studio/VC98/INCLUDE)
(2)$(VCInstallDir)atlmfc/include(/Microsoft Visual Studio/VC98/ATL/INCLUDE、/Microsoft Visual Studio/VC98/MFC/INCLUDE)
(3)$(VCInstallDir)PlatformSDK/include(VC2005)。
對于“Tools→Options→Directories→Include files”(“工具→選項→項目和解決方案→VC++目錄→包含檔案”)目錄下的檔案的包含,一般可使用尖括号包含。系統對尖括号的包含優先到編譯器設定的包含路徑下定位,再到附加包含目錄下進行定位。
#include "MyHeader.h"為在“Tools→Options→Directories→Include files”(“工具→選項→項目和解決方案→VC++目錄→包含檔案”)處人工添加的包含路徑下的頭檔案或者附加包含目錄下的頭檔案。
對于編譯器提供的标準庫函數頭檔案(“Tools→Options→Directories→Include files”(“工具→選項→項目和解決方案→VC++目錄→包含檔案”)),一般使用尖括号進行包含聲明,當然使用雙引号包含也沒有錯。
對于在“Tools→Options→Directories→Include files”(“工具→選項→項目和解決方案→VC++目錄→包含檔案”)處人工添加的包含路徑和附加包含目錄下的頭檔案的包含可以使用尖括号進行包含,但一般使用雙引号。
原則上,對于工程或檔案可見的包含目錄下的頭檔案包含,使用以上兩種包含方式中的任一種都不會出錯,主要是它們在搜尋目錄時的順序不一樣。習慣上使用尖括号包含标準庫函數頭檔案,使用雙引号包含使用者自定義頭檔案。
一般針對具體工程使用附加頭檔案包含即可,不必去動編譯器的“Tools→Options→Directories→Include files”(對應VC2005的“工具→選項→項目和解決方案→VC++目錄→包含檔案”)。但是,對于像DirectX、wxWidgets等這樣的SDK,一般宜對include/library路徑作編譯器級全局配置,同時指定相應source路徑,以便做源碼級調試(F11進入SDK内部代碼)。下面的連結庫包含情同此理。
五.附加連結庫包含
VC6.0預設lib包含路徑:Tools→Options→Directories→Library files
對于特定項目的頭檔案包含,可以通過以下兩步添加附加連結庫:
1. 在“Project Setting→Link(Category:Input)→Additional library path”處添加附加庫目錄,相對目錄參考*.dsp檔案。
相應的将會在“Project Setting→Link→Project Options”處同步“/libpath”庫包含指令。
2. 在“Project Setting→Link(Category:General)→Object/Library Modules” 處添加庫檔案名YourLib.lib(也可在檔案中使用#pragma comment(lib, "YourLib.lib")顯式導入所依賴的靜态庫),多個庫之間以空格分隔。
相應的将會在“Project Setting→Link→Project Options”處同步包含的庫名稱。
VC2005預設lib包含路徑:工具→選項→項目和解決方案→VC++目錄→庫檔案
對于特定項目的庫檔案包含,可以通過以下兩種方式添加附加庫目錄:
1.
(1)在“項目屬性→配置屬性→連結器→正常→附加庫目錄”處輸入附加庫目錄路徑,相對目錄參考$ProjectPath(*.vcproj檔案路徑)。
相應的将會在“項目屬性→配置屬性→連結器→指令行”處同步“/LIBPATH”庫包含指令。
(2)在“項目屬性→配置屬性→連結器→輸入→附加依賴項” 處添加庫檔案名YourLib.lib(也可在檔案中使用#pragma comment(lib, "YourLib.lib")顯式導入所依賴的靜态庫),多個庫之間以空格分隔。
相應的将會在“項目屬性→配置屬性→連結器→指令行”處同步包含的庫名稱。
2.
在“項目屬性→配置屬性→連結器→指令行” 處添加庫檔案名YourLib.lib(必要時添加相對目錄,保證YourLib的可見性)。
六.生成檔案目錄設定
在“Project Setting→General→Output directories”的“Output files”處填寫*.exe或*.lib/*.dll的生成目錄,相應在“Project Setting→Link(或Library)→Output file name”處将會同步檔案輸出路徑。相對目錄參考*.dsp檔案。
在“Project Setting→General→Output directories”的“Intermediate files”處填寫中間檔案生成目錄。相對目錄參考*.dsp檔案。
在“項目屬性→正常→輸出目錄”處填寫輸出目錄,在“項目屬性→正常→中間目錄”處填寫中間目錄,相對目錄參考$ProjectPath(*.vcproj檔案路徑)。
在“項目屬性→連結器(或管理者)→正常→輸出檔案”處填寫輸出檔案路徑。
輸出目錄(OutDir)一般為$(SolutionDir)$(ConfigurationName)
輸出檔案(OutputFile)一般為$(OutDir)/$(ProjectName).exe(*.lib,*.dll)
1.環境變量宏說明
$(SolutionDir)為*.sln檔案所在檔案夾,尾帶‘/’;
$(ProjectDir)為*.vcproj檔案所在檔案夾,尾帶‘/’;
$(PlatformName)為平台名稱,例如Win32,Windows Mobile 6 Professional SDK(ARMV4I)。
$(ConfigurationName)為*.sln的*.vcproj檔案所在檔案夾下的debug、release檔案夾,參考*.vcproj檔案中的<Configurations>配置項。
具體在“項目屬性→配置屬性→調試→指令”下拉點選“編輯”,展開“宏(M)>>”,可以看到很多項目内置宏。
2.生成目錄的配置
輸出目錄(OutDir):$(ProjectDir)$(PlatformName)/$(ConfigurationName)
以上穿插$(PlatformName)主要是為了釋出多平台版本考慮,對于普通的單平台開發,該路徑可選。
TargetDIr為OutDir後加‘/’。
輸出檔案主要按項目區分如下:
(1)DLL項目:*.pdb,*.exp,*.lib
(2)EXE項目:*.pdb
中間目錄(IntDir):$(OutDir)/Intermediate
輸出檔案:$(OutDir)/$(ProjectName).lib(dll、exe)
(1)DLL項目:*.ilk,*.dll
(2)EXE項目:*.ilk,*.exe
一般一個大的工程(*.dsw,*.sln),同時含有LIB、DLL和EXE項目,習慣将LIB輸出到項目輸出目錄或将這些連結時用到的LIB放到專門的目錄;EXE和其運作依賴的DLL都輸出到BIN目錄,這樣便于項目的組織和最終成果的釋出。
七.關于相對目錄
相對目錄是相對某個檔案而言的,例如在VC項目屬性配置附加包含目錄、附加庫目錄則是相對*.dsp、*.vcproj檔案而言的;在某個*.c、*.cpp檔案中使用#include包含指令,是相對這個*.c、*.cpp檔案而言的。
目前目錄是可見的,一般直接引用檔案名(夾),對于子檔案夾可以添加”./”。
..:父目錄
../include:父目錄下的include目錄
../..:祖父目錄
http://www.cnblogs.com/include:祖父目錄下的include目錄
在VC2005中,“屬性視窗”可檢視目前文檔的“檔案資訊”,其中可檢視檔案相對*.vcproj的相對路徑。
八.依賴項目聯編
一個解決方案(dsw、sln)可以建立很多輔助子項目(dsp、vcproj),如何設定使在編譯主項目的時,先編譯所依賴的輔助項目呢?
一般會配置輔助子項目的OutDir和主項目相同,這樣生成的lib或dll對于主項目exe直接可見。
選擇菜單“Project→Dependencies”可以選擇需要聯編的項目。
在解決方案資料總管中右擊項目名稱,選擇“引用”或“項目依賴項”菜單可添加(選擇)引用依賴項目;選擇“項目生成順序”可檢視建立項目依賴後的項目生成順序。
建立依賴關系後,主項目編譯(F7,Build)時,若發現輔助依賴子項目有改動,則會先編譯子項目。
九.附加DLL調試
如果你需要調試的DLL是動态裝入(LoadLibrary)的,則需要在“Project Setting →Debug(Category:Additional DLLs)”處添加這個DLL檔案。
Place a check in the first column to load the module’s symbols at the start of a debug session.
十.導出makefile
VC6.0中選擇菜單“Project→Export Makefile”即可導出Makefile檔案*.mak。
VC6以後不再支援makefile輸出了。
十一.代碼的編輯與閱讀導航
Visual Studio本身就帶有充分的代碼組織、編輯、分析以及閱讀能力的支援。
VC6.0的“Project Settings→C/C++→Generate Browse info”和“Project Settings→Browse info→Build browse info file”可生成向導檔案,FileView和ClassView需要這些資訊導航。
VC6.0和VC2005中的“Edit→Find in Files”支援指定項目、工程或檔案内的關鍵字搜尋。
VC6.0的“Tools→Source Browser”(Alt+F12),提供對“Definitions and References”、“File Outline”、“Base Classes and Members”、“Derived Classes and Members”、“Call Graph”、“Callers Graph”等導航功能支援。VC2005側邊欄“類視圖”中支援顯示“基類型”、“派生類型”、“繼承成員”等功能,右鍵快捷菜單中的“調用浏覽器”支援函數調用關系圖和被調用關系圖的檢視。
編輯時,VC6右鍵快捷菜單支援“List Members”、“Parameter Info”、“Type Info”、“Complete Word”。對應VC2005文本編輯器工具欄中的“顯示對象成員清單”、“顯示參數資訊”、“顯示快速資訊”、“顯示文字自動完成”。
VC2005右鍵快捷菜單中支援“查找所有引用”,配合代碼定義視窗,可很友善地浏覽代碼。VC2005标準工具欄中的“向後定位/向前定位”支援定位功能。此外,在閱讀代碼時,我們可以使用書簽(Bookmark)來設定錨點,這樣就可以實作基于書簽的自定義索引導航。
下面介紹常用的程式設計輔助插件軟體及源代碼層次結構分析工具軟體。
逆向工程(Reverse Engineer)就是從現有系統的代碼來生成模型的功能。通過Rational Rose分析已有的代碼,可了解代碼結構和資料結構,生成類層次關系圖、資料模型圖群組件圖。
十二. VC常用快捷鍵
Alt+F7:Project Settings
Ctrl+J/K:尋找上一個/下一個預編譯條件
Ctrl+Shift+J/K:尋找上一個/下一個預編譯條件并将這一塊標明
Ctrl+Tab:目前打開文檔和上一次打開文檔切換。
Alt+O:頭檔案與cpp檔案的互動顯示
F12:Goto definition
Shift+F12:Goto reference
Ctrl+Home:文檔頭
Ctrl+Shift+Home:標明從目前位置到文檔頭
Ctrl+End:文檔尾
Ctrl+Shift+End:標明從目前位置到文檔尾
Alt+F8:自動格式重排
Ctrl+F4:關閉目前文檔
Ctrl+Z/Alt+Backspace:Undo
Ctrl+Shift+Z/Ctrl+Y:Redo
Ctrl+B/Alt+F9:編輯斷點
Ctrl+Shift+F9:去掉所有斷點
Ctrl+D:定位工具條查找輸入欄
Alt+F3/Ctrl+F:目前文檔查找
Ctrl+F3:查找下一個
Ctrl+Shift+F3:查找上一個
Ctrl+H:替換
Ctrl+]:括号比對
Ctrl+↑:向上滾屏
Ctrl+↓:向下滾屏
Ctrl+←:移到前一個單詞
Ctrl+→:移到後一個單詞
Ctrl+Shift+←:標明目前位置到前一個單詞
Ctrl+Shift+→:標明目前位置到後一個單詞
Ctrl+Shift+]:括号比對塊選
Ctrl+Shift+F8:配合滑鼠和方向鍵實作豎直塊選
Ctrl+Backspace:删除目前單詞的前半截(以光标為分割)
Ctrl+Del:删除目前單詞的後半截(以光标為分割)
Ctrl+L:剪切目前行
Ctrl+Shift+L:删除目前行
F2:上一個書簽
Shift+F2:上一個書簽
Alt+F2:編輯書簽
Ctrl+F2:添加/删除一個書簽
Ctrl+Shift+F2:清除所有書簽
參考: