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

2021-09-27 02:42:28 字數 2207 閱讀 1178

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

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

鑑於這樣的理解,我對於工程中.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檔案中,編譯器就無法檢查宣告和定義的一致性(宣告和定義不在同乙個檔案中)。那麼,要讓編譯器檢查定義和宣告的一致性呢,自然是把定義和宣告放在同乙個檔案中,而如何實現把定義和宣告放在同乙個檔案裡呢?

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

總結:c語言原始檔包含自己的標頭檔案有兩個好處:

1.方便編譯的時候檢查函式宣告和定義的一致性,免得執行時出錯

有三個檔案:math.c myadd.c  myadd.h,內容如下:

#include #include "myadd.h"

int main(void)

#ifndef _myadd_h

#define _myadd_h

int myadd(int ,int );

#endif

#includevoid myadd(char * a, int b,int c)

編譯不報錯,但是執行就炸了。

而如果在myadd.c當中如果包含了myadd.h標頭檔案的話,編譯的時候就會檢查出錯誤

2.不包含的話,可能會報錯

這裡有個警告。

//建立乙個mysub.c,不包含標頭檔案mysub.h

總之 一句話,按規矩來就好。

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

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