我們經常在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。這樣的做法就是把外部函式sum的宣告放到了b.c中來。然而,這樣的做法很不妥。②a.c中定義了乙個函式sum。
③b.c要引用sum這個函式。做法是:在b.c中宣告sum這個函式。然後b.c就可以使用sum函式了。
不妥的原因:
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...