1. CPP 是如何工作的
§1 第一個(gè)程序:Hello World
程序源碼與解釋

程序源碼
#include 指令 #include 指令用于搜索引用在 < > 內(nèi)的文件, ?并將該文件復(fù)制粘貼到源文件中. 上例中所尋找的文件便是 iostream, 該文件聲明了 cout, cin 等函數(shù).
main() 函數(shù) main() 函數(shù)是整個(gè) CPP 程序的入口, main() 函數(shù)結(jié)束時(shí), 程序便結(jié)束了.
在 C 語言的基礎(chǔ)上, 容易知道, CPP 的 main() 函數(shù)的返回值為 int 類型, 即一個(gè)整數(shù). 然而, 程序源碼中并未使用 return 語句說明返回值, 而對一般的返回值非 void 的函數(shù), 這是非法的. 事實(shí)上, ?在 CPP 中, 對 main() 函數(shù)而言, 若未使用 return 語句返回一個(gè)整數(shù), 它會(huì)默認(rèn)以 0 作為返回結(jié)果.

重載運(yùn)算符與 CPP 流式輸出 重載運(yùn)算符是 CPP 區(qū)別于 C 的一大新特性. CPP 允許將一些已有定義的運(yùn)算符重載為用于新運(yùn)算的運(yùn)算符. 上例中, << 這個(gè)左移運(yùn)算符被重載為輸出運(yùn)算符, 用于在屏幕上打印出字符串.
事實(shí)上, 所謂的重載運(yùn)算符, 本質(zhì)上是一個(gè)函數(shù). 所以上例中的輸出代碼還可以改寫為
這段代碼 (以及程序源碼 中的輸出代碼) 的作用是向 std::cout, 即 CPP 輸出流中推送字符串 Hello, World! 和行換行符.
其他處理 為防止程序在打印語句后直接關(guān)閉終端窗口 (由于速度過快以至于看不清輸出是否正確), 可通過
解決. 該函數(shù)等待我們輸入任意一個(gè)字符, 在執(zhí)行完該函數(shù)后, 程序?qū)⒔Y(jié)束運(yùn)行.
通過 Visual Studio 編譯運(yùn)行它

在建立完一個(gè)空項(xiàng)目并確定好其位置后, 有以下幾種方式編譯單個(gè)文件.
快捷鍵 Ctrl + F7.
工具欄的編譯按鈕.
除此外, 由于該項(xiàng)目目前只有一個(gè)文件 (一般命名為 Main.cpp), 所以也可以直接編譯項(xiàng)目而不用擔(dān)心鏈接錯(cuò)誤.
右鍵項(xiàng)目并點(diǎn)擊生成.
快捷鍵 Shift + F7.
§2 CPP 程序的編譯過程
預(yù)處理

上述源碼將送至編譯器中編譯為可執(zhí)行二進(jìn)制碼.
在編譯之前, 當(dāng)編譯器讀到 # 時(shí), 將認(rèn)定該語句為預(yù)處理指令, 并執(zhí)行預(yù)處理.
預(yù)處理指令 以 # 開頭的, 只占一行的語句. 它總是出現(xiàn)在 CPP 程序開頭.
預(yù)處理 在編譯前對預(yù)處理指令的執(zhí)行過程.
編譯

在編譯階段, 程序?qū)⒃闯绦虼a轉(zhuǎn)換為二進(jìn)制碼.
Visual Studio 中的編譯配置 在 Visual Studio 中, 編譯配置分為兩個(gè)重要的部分,
解決方案配置. 其存在兩個(gè)默認(rèn)選項(xiàng): Debug 和 Release.
解決方案平臺(tái). 其存在多個(gè)默認(rèn)選項(xiàng), 這取決于用戶配置的開發(fā)平臺(tái)的多少. 僅對 Windows 平臺(tái)開發(fā)而言, 它分為 x64 和 x86 (WIN32) 兩種, 前者表示 64 位系統(tǒng)程序, 后者表示 32 位系統(tǒng)程序.
解決方案配置實(shí)質(zhì)上是構(gòu)建項(xiàng)目時(shí)的一系列規(guī)則, 而解決方案平臺(tái)是指該項(xiàng)目運(yùn)行的目標(biāo)平臺(tái).
其他詳細(xì)信息, 請參考 Microsoft Visual Studio 幫助文檔.
為何 Debug 要比 Release 慢 對 Visual Studio 而言, Debug 默認(rèn)關(guān)閉代碼優(yōu)化, 而 Release 總是以最大速度優(yōu)化. 前者對代碼調(diào)試是有好處的.
編譯器的編譯對象 項(xiàng)目中的每個(gè) CPP 文件都將被編譯, 而頭文件不會(huì). 事實(shí)上, 所用的頭文件將會(huì)在預(yù)處理后被復(fù)制在各個(gè)包含了它們的 CPP 中, 從而與 CPP 一同被編譯.
在 Visual Studio 中, 項(xiàng)目中的每個(gè) CPP 文件都將被編譯為 .obj 文件 (目標(biāo)文件 Object File).
鏈接

編譯器將所有 CPP 源文件編譯為獨(dú)立的目標(biāo)文件. 然而, 一個(gè)項(xiàng)目大多只需要一個(gè)可執(zhí)行文件, 將這些獨(dú)立的目標(biāo)文件按照一定順序合并為一個(gè)可執(zhí)行文件, 便是鏈接器的工作.
為了進(jìn)一步說明鏈接, 試作如下例子
聲明 在 CPP 中, 任何符號都需要聲明. cout, cin 等等已經(jīng)在 iostream 文件中聲明. 因此, 只有通過 #include 指令包含 iostream 才能使用 cout, cin 等. 聲明用于告知編譯器對象對象存在.
聲明的寫法很簡單
只需要告知函數(shù)名, 函數(shù)返回值類型和函數(shù)的參數(shù)類型列表即可.
定義 定義是指一個(gè)函數(shù)所實(shí)現(xiàn)的具體功能. 這個(gè)具體功能將被放在函數(shù)體, 即兩個(gè)花括號 { } 之間的位置.
鏈接錯(cuò)誤 當(dāng)鏈接器找不到已經(jīng)聲明并調(diào)用的函數(shù)所在位置時(shí), 將會(huì)告知鏈接錯(cuò)誤. (將上述 Log.cpp 中的 Log() 函數(shù)名修改即可復(fù)現(xiàn)該類錯(cuò)誤.)

鏈接錯(cuò)誤分為以下幾部分:
說明該符號無法解析. 因?yàn)榫幾g器先解析該符號, 然后去尋找它的位置.
調(diào)用該符號的系統(tǒng)內(nèi)部命名.