應該記住的一點就是,.h標頭檔案中,只能存在變數或者函式的宣告, 而不要放定義。即,只能在標頭檔案中寫形如:extern int a;和void f();的句子。這些才是宣告。如果寫上int a;或者void f() {}這樣的句子,那麼一旦這個標頭檔案被兩個或兩個以上的.cpp檔案包含的話,編譯器會立馬報錯。(關於extern,前面有討論過,這裡不再討論定義跟 宣告的區別了。)
但是,這個規則是有三個例外的。
一,標頭檔案中可以寫const物件的定義。因為全域性的const物件默 認是沒有extern的宣告的,所以它只在當前檔案中有效。把這樣的物件寫進標頭檔案中,即使它被包含到其他多個.cpp檔案中,這個物件也都只在包含它的 那個檔案中有效,對其他檔案來說是不可見的,所以便不會導致多重定義。同時,因為這些.cpp檔案中的該物件都是從乙個標頭檔案中包含進去的,這樣也就保證 了這些.cpp檔案中的這個const物件的值是相同的,可謂一舉兩得。同理,static物件的定義也可以放進標頭檔案。
二,標頭檔案中可 以寫內聯函式(inline)的定義。因為inline函式是需要編譯器在遇到它的地方根據它的定義把它內聯展開的,而並非是普通函式那樣可以先宣告再鏈 接的(內聯函式不會鏈結),所以編譯器就需要在編譯時看到內聯函式的完整定義才行。如果內聯函式像普通函式一樣只能定義一次的話,這事兒就難辦了。因為在 乙個檔案中還好,我可以把內聯函式的定義寫在最開始,這樣可以保證後面使用的時候都可以見到定義;但是,如果我在其他的檔案中還使用到了這個函式那怎麼辦 呢?這幾乎沒什麼太好的解決辦法,因此c++規定,內聯函式可以在程式中定義多次,只要內聯函式在乙個.cpp檔案中只出現一次,並且在所有的.cpp文 件中,這個內聯函式的定義是一樣的,就能通過編譯。那麼顯然,把內聯函式的定義放進乙個標頭檔案中是非常明智的做法。
三,標頭檔案中可以寫類 (class)的定義。因為在程式中建立乙個類的物件時,編譯器只有在這個類的定義完全可見的情況下,才能知道這個類的物件應該如何布局,所以,關於類的 定義的要求,跟內聯函式是基本一樣的。所以把類的定義放進標頭檔案,在使用到這個類的.cpp檔案中去包含這個標頭檔案,是乙個很好的做法。在這裡,值得一提 的是,類的定義中包含著資料成員和函式成員。資料成員是要等到具體的物件被建立時才會被定義(分配空間),但函式成員卻是需要在一開始就被定義的,這也就 是我們通常所說的類的實現。一般,我們的做法是,把類的定義放在標頭檔案中,而把函式成員的實現**放在乙個.cpp檔案中。這是可以的,也是很好的辦法。 不過,還有另一種辦法。那就是直接把函式成員的實現**也寫進類定義裡面。在c++的類中,如果函式成員在類的定義體中被定義,那麼編譯器會視這個函式為 內聯的。因此,把函式成員的定義寫進類定義體,一起放進標頭檔案中,是合法的。注意一下,如果把函式成員的定義寫在類定義的標頭檔案中,而沒有寫進類定義中, 這是不合法的,因為這個函式成員此時就不是內聯的了。一旦標頭檔案被兩個或兩個以上的.cpp檔案包含,這個函式成員就被重定義了。
標頭檔案中應該放些什麼2
標頭檔案中應該放些什麼2 字型 作為一般規則,應該把這些東西放入頭 h 檔案中 當宣告或巨集定義需要在多個檔案中共享時,尤其需要把它們放入標頭檔案中。特別是,永遠不要把外部函式原型 即外部函式宣告 放到 c 檔案中。另一方面,如果巨集定義或宣告為乙個 c 檔案私有,則最好留在 c 檔案中。標頭檔案中...
標頭檔案中不可以放變數的定義
注意標頭檔案中不可以放變數的定義!一般情況下標頭檔案中只放變數的宣告,因為標頭檔案 要被其他檔案包含 即 include 如果把定義放到標頭檔案的話,就不能避免多次定義變數,c 不允許多次定義變數,乙個程式中對指定變數的定義只有一次,宣告可以無數次。不過有三個例外,一下三中實體的定義也可放到標頭檔案...
linux 標頭檔案以及庫的路徑
原來在編譯的時候可以指定執行時去 找需要的lib檔案,長知識了 本文詳細介紹了linux 下gcc標頭檔案指定方法,以及搜尋路徑順序的問題。另外,還總結了,gcc動態鏈結的方法以及路徑指定,同樣也討論了搜尋路徑的順序問題。本文包含了很多的例子,具有很強的操作性,希望讀者自己去走一遍。一.includ...