C++ 寫個遊戲引擎—(基礎篇) 2
目標 :瞭解 c++ 編譯過程
基本要求 :有一定程式設計基礎,對遊戲程式設計有熱情
開發平臺 :windows
開發工具 :visual studio 2017 communicty
除錯 c++ ,我們去掉get()後的;號,然後 ctrl+f7 對main.cpp 進行編譯。

如果程式編譯或build時報錯,我們儘量不要看這裡提示,這裡提示資訊不準確。

我們需要看 輸出 中的錯誤資訊,C2143 中 C表示編譯錯誤。還有這裡我用的是中文版 visual studio ,大家還儘量用英文版 vs。

我們將 Log.cpp 中函式 Log 的函式名修改為 Logr,然後編譯Log.cp 檔案

然後我們嘗試編譯(呼叫 Log.cpp 中 Log 方法的) Main.cpp

發現編譯並沒有報錯,這是因為在編譯時,只要宣告 Log 函式,編譯器就相信您的宣告認為函式已經存在,編譯器並不關心Log 函式實際上是否存在。
但如果嘗試 build 專案,結果就會發現這時 build(生成) 失敗了,這是因為連結時,無法找到宣告函式的函式體,所有提示我們 main.cpp 引用的符號(symbol) 還沒有定義。

先說一下編譯,在編譯前先需要進行預處理,然後將 cpp 檔案編譯為 obj 檔案這就就是大概編譯的過程。預處理會執行那些預處理語句。預處理後的檔案格式就符合編譯器的要求(也就是建立了 AST),這時候編譯器就可以對 cpp 檔案進行編譯了。編譯後的程式碼就是 CPU 可以執行的一些靜態資料或指令(機器碼)。在 cpp 中檔案作用與 java 中的檔案含義不同,在 java 中檔名需要和型別一致,並且包名需要資料夾結構一致,java 需要通過這些資訊讀取檔案確定檔案存在,在 cpp 中檔案只是負責為編譯器提供程式碼,所有檔名和資料夾結構不需要與程式碼有任何關聯。編譯器只是對副檔名感興趣,對不同的副檔名(如 c .cpp .h) 按不同型別檔案進行處理而已。
我們看cpp編譯後 obj 檔案大小,這些檔案都很大,是因包含了 iostream

我們來建立一個 cpp 檔案,命名為 Math.cpp

然後輸入以下程式碼

ctrl+f7編譯 Math.cpp ,然後 debug 資料夾就會發現這裡多了一個編譯好的 obj 檔案。

有許多預處理符號,我們今天就介紹 #include 其他的隨後會分享給大家。
#include 用法很簡單,就是開啟要包含的檔案,然後將檔案內容複製其所在的位置。
首先我們在 標頭檔案 夾中建立一個 EndBrace.h

在這個檔案中僅輸入 } (結束花括號)

回到 Math.cpp 檔案中,將 } 替換為 #include "EndBrace.h"

然後編譯 Math.cpp 編譯成功。

我們看一看預處理的過程,開啟 屬性 對話方塊,然後進行下圖中操作,將預處理檔案從”否“修改為”是“,這樣我們就看到預處理的過程。

再次編譯 Math.cpp 檔案,發現在 debug 目錄下多出一個 Math.i 檔案。

這裡我用 visual studio code 開啟 Math.i 檔案。看圖我們發現實際上就是將包含預處理語句(#include) 替換為 EndBrace 中的內容。

然後使用 #define 將 INTEGER 定義為 int, 預處理時會根據 #define 定義內容進行替換。這裡將 INTEGER 全部替換為 int

開啟 Math.i 檔案看效果


我們也可以通過 #if 語句控制其包含的程式碼塊是否顯示( 0 不顯示 1 為顯示),預處理會根據 #if 來控制程式碼是否參與 build




