一、預編譯
C++的預編譯(預處理),是指在C++程序源代碼被編譯之前,由預處理器對C++程序源代碼進行的處理。這個過程並不對程序的源代碼進行解析,但它把源代碼分割或處理成爲特定的符號用來支持宏調用。
程序的編譯過程可以分爲預處理、編譯、彙編三部分,其中預處理是首先執行的過程,預處理過程掃描程序源代碼,對其進行初步的轉換,產生新的源代碼提供給編譯器。預處理過程讀入源代碼之後,會檢查代碼裏包含的預處理指令,完成諸如包含其他源文件、定義宏、根據條件決定編譯時是否包含某些代碼的工作。
總之,預編譯程序的作用就是根據源代碼中的預編譯指令修改源代碼。而預編譯程序是由一系列和預編譯相關的的命令符組成的。預編譯指令以“#”作爲起始標誌,其後緊跟預編譯指令關鍵字,之後是空格,空格之後是預編譯指令的內容。
二、頭文件的作用
- 通過頭文件調用庫功能。很多場合,源碼不方便向用戶公佈,只提供頭文件和二進制的庫,用戶只需按照頭文件中的接口調用庫功能,而不必關心接口的實現。
- 頭文件加強類型安全檢查。在接口被實現或使用時與頭文件中的不一致,編譯器就會報錯,大大減輕了調試改錯的負擔。
三、解決重定義錯誤
- 原因:頭文件中av_ts的定義,同時被多個源文件引用。
舉個栗子:
頭文件a.h
int a = 10;
源文件b.cpp
#include "a.h"
源文件c.cpp
#include "a.h"
預編譯階段會把a.h中的內容拷貝(說法不嚴謹)到b.cpp和c.cpp中,編譯生成b.obj和c.obj。鏈接器會把所有的全局變量寫到全局符號表。
此時,鏈接器就會發現b.obj和c.obj中都定義了變量a,所以會出現重定義的錯誤。
- 解決辦法
不要在頭文件中定義全局變量或函數。如果定義了全局變量,確保該頭文件只被包含一次。如果定義了函數,將該函數聲明爲inline。