c++編譯過程簡介
阿新 • • 發佈:2019-02-04
- extern:這就是告訴編譯器,這個變數或函式在別的編譯單元裡定義了,也就是要把這個符號放到未解決符號表裡面去(外部連結)。
- static:如果該關鍵字位於全域性函式或者變數的宣告前面,表明該編譯單元不匯出這個函式或變數,因些這個符號不能在別的編譯單元中使用(內部連結)。如果是static區域性變數,則該變數的儲存方式和全域性變數一樣,但是仍然不匯出符號。
- 預設連結屬性:對於函式和變數,預設連結是外部連結,對於const變數,預設內部連結。
- 外部連結的利弊:外部連結的符號在整個程式範圍內都是可以使用的,這就要求其他編譯單元不能匯出相同的符號(不然就會報 duplicated external symbols)。
- 為什麼標頭檔案裡一般只可以有宣告不能有定義:標頭檔案可以被多個編譯單元包含,如果標頭檔案裡面有定義的話,那麼每個包含這標頭檔案的編譯單元都會對同一個符號進行定義,如果該符號為外部連結,則會導致duplicated external symbols連結錯誤。
- 為什麼公共使用的行內函數要定義於標頭檔案裡:因為編譯時編譯單元之間互不知道,如果內聯被定義於.cpp檔案中,編譯其他使用該函式的編譯單元的時候沒有辦法找到函式的定義,因些無法對函式進行展開(行內函數不展開,即不採用在使用處標記函式程式碼再跳轉的方式,而是直接將程式碼嵌入)。所以如果行內函數定義於.cpp裡,那麼就只有這個.cpp檔案能使用它。
- .h中的inline 函式可以被多個cpp包含而不造成符號衝突,因為它會被直接嵌入到呼叫的地方,內部聯結不形成外部符號,對外不可見