什麼應該放在頭文件?【資料分享】

什麼應該頭文件裏【資料分享】

   頭文件爲相關聲明提供了一個集中存的位置。頭文件一般包含類的定義、枚舉的定義、extern變量的聲明、函數的聲明、const int的定義、inline函數的定義。使用或者定義這實體的文件要包含適當的頭文件

  

頭文件用於聲明,而不用於定義

  當設計頭文件時,記住定義和聲明的區別是很重要的。定義只可以出現一次,而聲明可以出現多次。下列語句是定義,所以不應該頭文件裏: 

Extern int ival = 10;           //有初始化,所以是定義
Double fica_rate;               //沒有extern關鍵字,所以也是定義

因爲以上兩個語句都是定義(其實還因爲全局變量默認的連接類型是extern,即外連接),所以,當同一個程序中有兩個或兩個以上文件含有上述任一個定義都會導致多重定義鏈接錯誤。
  因爲頭文件被設計用來包含在多個源文件中,所以不應該含有變量或者函數的定義。

  對於頭文件不應該含有定義這一規則,有三個例外:類定義、枚舉的定義、值在編譯時就已知的const對象、inline函數。這實體可以在多個源文件中定義,只要每個源文件中的定義是相同的。

  在頭文件中定義這實體,是因爲編譯器需要它們的定義(不只是聲明)來產生代碼。例如:爲了產生能定義和使用類對象的代碼,編譯器需要知道組成該類型的數據成員。同樣還需要知道能夠在這對象上執行的操作。而類定義正好提供了這信息。

  const對象(變量)默認是定義該變量的文件的局部變量,連接類型爲內連接。所以,當多個源文件include包含同一個含有const對象定義的頭文件時,不會產生多重定義的鏈接錯誤。這是因爲,實質上每個包含該頭文件的源文件都有了自己的const變量,都爲它分配的存儲空間,其名稱和值都一樣。同時,因爲const變量默認連接類型是內連接,所以不會產生多重定義的鏈接錯誤。

  在大部分的編譯器實現中,編譯器都會用相應的常量表達式來替換對這const變量的使用。所以,在實踐中不會有任何存儲空間用於存儲 用常量表達式初始化的const變量。

  如果const變量不是用常量表達式初始化的,那麼它就不應該在頭文件中定義。它應該和其他的變量一樣,應該定義在一個源文件中並初始化,在頭文件中爲它添加extern聲明,以便被多個文件共享。

外連接

  全局變量、全局函數默認是外連接的。

內連接

  類定義、全局常量、const對象(變量)、typedef類型、宏定義 默認爲內連接的。另外,定義時被顯示加上static關鍵字的全局變量和全局函數,具有文件作用據,連接類型也爲內連接。

  默認爲內連接的標識符,如果顯示加上extern關鍵字,即變成外連接。

外連接標識符的使用

         在使用外連接的實體的時候,可以include其定義所在的文件(錯誤的方法,產生鏈式錯誤:多重定義),還可以include其聲明所在的文件。也可以採用第三種方法:直接在使用外連接實體的文件中,直接對外連接實體進行一次extern聲明(若外連接實體類型爲函數,則不用extern關鍵字,函數原型OK了)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章