HackingC++ Learning筆記 Chapter8-Code Organization

通常面試不太會問到,可是比較難理解透面試

Separate Compilation 分離編譯

C++編譯模型 - 預處理+編譯+彙編+連接

基本概念不寫了感受都沒啥可說的,記一個命名空間污染的問題
image.png
和一個內部連接,外部連接的問題
image.png
image.png函數

內部連接:若是一個名稱對於某個編譯單元來講是局部的,在連接的時候其餘的編譯單元沒法連接到它且不會與其餘的連接單元中一樣的名稱相沖突。例如static函數、inline函數等。
外部連接:若是一個名稱對於編譯單元來講不是局部的,在連接的過程當中其餘的編譯單元能夠訪問它。例如全局變量和普通函數(普通函數默認爲extern)。

哪些實體擁有內部連接:spa

  • static全局變量,static函數,友元函數定義
  • 類的定義
  • 內聯函數定義
  • Union共同體定義
  • 命名空間的const常量定義
  • 枚舉類型定義
  • 全部的聲明(有人將其歸結爲無連接)

哪些實體擁有外部連接:code

  • 類的非內聯函數(包括成員函數和靜態類成員函數的定義)
  • 類的靜態成員變量的定義
  • 名字空間或全局的非靜態的自由函數,非靜態變量,非友元函數的定義。

       所以,擁有外部連接的實體若是被聲明在頭文件而且被多個.cpp文件包含,可能就會出現連接衝突錯誤,由於每一個包含這個擁有外部連接實體的.cpp都會分配空間,當多個編譯單元連接的時候,鏈接器就會面對多個相同的名字,沒法正常連接到正確的對象。對象

Namespaces 命名空間

相關文章
相關標籤/搜索