c原始檔中要包含自己的標頭檔案

2021-07-07 04:01:51 字數 1939 閱讀 4269

我們經常在c工程中發現,原始檔中要包含自己的標頭檔案。一直以來,都不知道為什麼這樣做。現在,我知道了。

我認為,.c檔案沒有必要包含自己的.h檔案。.h檔案包含.c檔案中定義的函式和全域性變數的宣告,.h檔案就是.c檔案提供的對外介面檔案。既然.h檔案就是.c檔案提供的對外介面檔案,那麼.c檔案就沒必要包含自己的.h檔案了(.h檔案是對外提供用的,對內又何必再包含進來呢)。

鑑於這樣的理解,我對於工程中.c原始檔包含自己的.h標頭檔案很是不理解,不知道為什麼要這樣做。

但是現在,我知道為什麼要原始檔包含自己的標頭檔案了。

「如果希望讓編譯器檢查宣告的一致性,一定要把全域性宣告放到標頭檔案中。特別是,永遠不要把外部函式的原型(也就是函式宣告)放到.c檔案中:通常它與定義的一致性不能得到檢查,而矛盾的原型(也就是函式宣告)比不用還糟糕。」

注意:外部函式的原型,就是外部函式的宣告。

這個外部函式a指的是b.c檔案之外定義的函式,b.c檔案中需要使用外部函式a,就需要先對外部函式a宣告(對外部函式的宣告就是外部函式原型)。對這個外部函式a的宣告,不能放在b.c檔案裡面來實現。

以例項說明:

①假若工程中有2個原始檔a.c和b.c;a.c的標頭檔案為a.h,b.c的標頭檔案為b.h。

②a.c中定義了乙個函式sum。

③b.c要引用sum這個函式。做法是:在b.c中宣告sum這個函式。然後b.c就可以使用sum函式了。

這樣的做法就是把外部函式

sum的宣告放到了

b.c中來。然而,這樣的做法很不妥。

不妥的原因

sum是在a.c中定義的,而聲明確是在b.c中,sum函式的定義和宣告不是在同乙個檔案中的。定義和宣告不在同乙個檔案中,編譯的時候,編譯器就不能對定義和宣告的一致性進行檢查。這樣,如果sum的定義和宣告不一致,編譯器就無法檢查出來(定義和宣告不在同乙個檔案中),那麼編譯的時候不會報錯,但是程式執行的時候就可能會出錯。而這樣的錯誤,查詢起來又不是很容易。

鑑於此,才這樣說:「永遠不要把外部函式的原型放到

.c檔案中」。

前面說,如果把外部函式的原型放到.c檔案中,編譯器就無法檢查宣告和定義的一致性(宣告和定義不在同乙個檔案中)。那麼,要讓編譯器檢查定義和宣告的一致性呢,自然是把定義和宣告放在同乙個檔案中,而如何實現把定義和宣告放在同乙個檔案裡呢?

答案:原始檔定義的函式,在原始檔對應的標頭檔案中宣告,然後原始檔包含自己的標頭檔案。這樣定義和宣告就放在同乙個檔案裡了。

援引上述例子:a.c中定義了函式sum,而函式本質上是外部的,函式sum是可以被其它原始檔呼叫的。那麼,我們把sum函式的宣告放在a.h中。然後a.c原始檔還要包含自己的標頭檔案,也就是a.h檔案。而b.c檔案要引用sum函式,就直接包含a.h檔案就可以。

sum函式的定義在a.c中,宣告是在a.h中,但是由於

a.c包含了

a.h,所以

sum的定義和宣告就是在同乙個檔案

a.c中了。這樣,編譯器編譯的時候,就能對sum函式定義和宣告的一致性做檢查,如果不一致,就會報錯。

至於其他原始檔引用這個外部函式

sum,不再採用直接宣告的方式,而是通過包含

a.h標頭檔案的方式。

這樣,編譯器檢查了sum函式定義和宣告的一致性沒有報錯,也就表明a.c中sum函式的定義和a.h中sum函式的宣告是一致的。那麼其他原始檔都是通過直接包含a.h,來使用函式sum,就也保證了sum函式宣告和定義的一致性了。

c

原始檔要包含自己的標頭檔案,目的就是讓編譯器檢查定義和宣告的一致性。

c原始檔中要包含自己的標頭檔案

我們經常在c工程中發現,原始檔中要包含自己的標頭檔案。一直以來,都不知道為什麼這樣做。現在,我知道了。我認為,c檔案沒有必要包含自己的.件。件包含.c檔案中定義的函式和全域性變數的宣告,件就是.c檔案提供的對外介面檔案。既然.件就是.c檔案提供的對外介面檔案,那麼.c檔案就沒必要包含自己的.件了 件...

C原始檔要包含自己的標頭檔案

我們經常在c工程中發現,原始檔中要包含自己的標頭檔案。一直以來,都不知道為什麼這樣做。現在,我知道了。我認為,c檔案沒有必要包含自己的.h檔案。h檔案包含.c檔案中定義的函式和全域性變數的宣告,h檔案就是.c檔案提供的對外介面檔案。既然.h檔案就是.c檔案提供的對外介面檔案,那麼.c檔案就沒必要包含...

C 原始檔包含C原始檔(C 中如何使用C)

如下 c語言標頭檔案 max.h ifndef max h define max h int max int na,int nb endif c語言實現檔案 max.c include max.h int max int na,int nb c 語言呼叫檔案 include max.h int tm...