【C++拾遺之八】預編譯

一、預編譯

C++的預編譯(預處理),是指在C++程序源代碼被編譯之前,由預處理器對C++程序源代碼進行的處理。這個過程並不對程序的源代碼進行解析,但它把源代碼分割或處理成爲特定的符號用來支持宏調用。

程序的編譯過程可以分爲預處理、編譯、彙編三部分,其中預處理是首先執行的過程,預處理過程掃描程序源代碼,對其進行初步的轉換,產生新的源代碼提供給編譯器。預處理過程讀入源代碼之後,會檢查代碼裏包含的預處理指令,完成諸如包含其他源文件、定義宏、根據條件決定編譯時是否包含某些代碼的工作。

總之,預編譯程序的作用就是根據源代碼中的預編譯指令修改源代碼。而預編譯程序是由一系列和預編譯相關的的命令符組成的。預編譯指令以“#”作爲起始標誌,其後緊跟預編譯指令關鍵字,之後是空格,空格之後是預編譯指令的內容。

二、頭文件的作用

  1. 通過頭文件調用庫功能。很多場合,源碼不方便向用戶公佈,只提供頭文件和二進制的庫,用戶只需按照頭文件中的接口調用庫功能,而不必關心接口的實現。
  2. 頭文件加強類型安全檢查。在接口被實現或使用時與頭文件中的不一致,編譯器就會報錯,大大減輕了調試改錯的負擔。

三、解決重定義錯誤

在這裏插入圖片描述

  1. 原因:頭文件中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,所以會出現重定義的錯誤。

  1. 解決辦法
    不要在頭文件中定義全局變量或函數。如果定義了全局變量,確保該頭文件只被包含一次。如果定義了函數,將該函數聲明爲inline。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章