關於在標頭檔案中定義函式的缺點

2021-06-09 06:18:22 字數 1259 閱讀 9590

同乙個函式、變數可以在不同的c檔案中根據需要有多個宣告,但只能有乙個定義。這就決定了如果在標頭檔案中定義函式或變數,則該標頭檔案只能使用一次,不能被別的c檔案使用,也即限制了最好只有乙個c檔案,因為別的c檔案已經不能再使用這些標頭檔案;而標頭檔案的真正用處是實現「介面」,使變數或函式供別的模組呼叫函式,函式類似「原子」的作用,該功能很多c檔案(和標頭檔案?)都會需要用到;而在標頭檔案中定義,則只是起到「插入」的作用,只是方便把不同功能的模組include到不同的檔案中。

那麼考慮另一中情況:如果我只使用乙個c檔案用來實現主函式,別的函式或者功能模組都定義在別的標頭檔案中,然後全部include到主函式所在的c檔案中,可不可以呢?貌似也比較方便,也是一種模組化程式設計,缺點就是,模組之間的函式不能共用。如果你保證模組之間的函式不需要共用,就可以;但如果是寫類似庫檔案的「原子函式」,就不能使用這種方法。

關於變數的定義和宣告:

變數的宣告有兩種情況: 

一種是需要建立儲存空間的。例如:int a 在宣告的時候就已經建立了儲存空間。

另一種是不需要建立儲存空間的 例如:extern int a 其中 變數a是在別的檔案中定義的。

其中,第一種是"定義性宣告(defining declaration)"或者稱為"定義(definition)",而後者則是"引用性宣告(referncing declaration)" 。從廣義的角度來講,宣告中包含著定義,但是並非所有的宣告都是定義,例如:int a 它既是宣告,同時又是定義。然而對於 extern int a 來講,它只是宣告不是定義。一般的情況下我們常常這樣敘述:把建立空間的宣告稱之為"定義",而把不需要建立儲存空間稱之為"宣告"。很明顯我們在這裡指的宣告是範圍比較窄的,也就是說非定義性質的宣告

#include using namespace std; 

int main()

int a; //是定義,定義了a為整型的外部變數

外部變數的"定義"與外部變數的"宣告"是不相同的。外部變數的定義只能有一次,它的位置是在所有函式之外,而同乙個檔案中的外部變數宣告可以是多次的,它可以在函式之內(哪個函式要用就在那個函式中宣告),也可以在函式之外(在外部變數的定義點之前)。系統會根據外部變數的定義(而不是根據外部變數的宣告)分配儲存空間的。對於外部變數來講,初始化只能是在"定義"中進行,而不是在"宣告"中 。所謂的"宣告",其作用,是宣告該變數是乙個已在後面定義過的外部變數,僅僅是在為了"提前"引用該變數而作的"宣告"而已。extern 只作宣告,不作任何定義 。

另:變數的extern宣告主要是為了訪問全域性變數。

c 標頭檔案中定義函式的優缺點

最近看caffe 有些標頭檔案中 直接實現了該函式。以前了解到是 標頭檔案盡量不要實現,放到cpp中實現,短小的程式也可以實現。但是為什麼這樣,標頭檔案實現有什麼優缺點不是很清晰。基於這個,這篇部落格重點在討論 標頭檔案實現函式的優缺點。比如caffe 在layer.hpp中實現 emplate i...

inline函式定義在標頭檔案中

寫這個內聯函式的時候也沒細想,結果違反了inline函式的要求。所謂內聯函式,就是編譯器將函式定義 之間的內容 在函式呼叫處展開,藉此來免去函式呼叫的開銷。如果這個函式定義在標頭檔案中,所有include該標頭檔案的編譯單元都可以正確找到函式定義。然而,如果內聯函式fun 定義在某個編譯單元a中,那...

關於const物件定義在標頭檔案中

摘自 c primer 4nd 一些const物件定義在標頭檔案中。而const變數要成為常量表示式,初始化式必須為編譯器可見。為了能夠讓多個檔案使用相同的值,const變數和它的初始化式必須是每個檔案可見的。而要使初始化式可見,一般把這樣的const變數定義在標頭檔案中。那樣的話,無論該const...