1. 程式人生 > >C語言中,標頭檔案和原始檔的關係(轉)

C語言中,標頭檔案和原始檔的關係(轉)

//a.h void foo();

//a.c #include "a.h"   //我的問題出來了:這句話是要,還是不要? void foo() {      return; }

//main.c #include "a.h" int main(int argc, char *argv[]) {     foo();    return 0; }                 針對上面的程式碼,請回答三個問題:

a.c 中的 #include "a.h" 這句話是不是多餘的?  為什麼經常見 xx.c 裡面 include 對應的 xx.h?  如果 a.c 中不寫,那麼編譯器是不是會自動把 .h 檔案裡面的東西跟同名的 .c 檔案繫結在一起?  (請針對上面3道題仔細考慮10分鐘,莫要著急看下面的解釋。:) 考慮的越多,下面理解的就越深。)

  好了,時間到!請忘掉上面的3道題,以及對這三道題引發出的你的想法,然後再聽我慢慢道來。正確的概念是:從C編譯器角度看,.h和.c皆是浮雲,就是改名為.txt、.doc也沒有大的分別。換句話說,就是.h和.c沒啥必然聯絡。.h中一般放的是同名.c檔案中定義的變數、陣列、函式的宣告,需要讓.c外部使用的宣告。這個宣告有啥用?只是讓需要用這些宣告的地方方便引用。因為 #include "xx.h" 這個巨集其實際意思就是把當前這一行刪掉,把 xx.h 中的內容原封不動的插入在當前行的位置。由於想寫這些函式宣告的地方非常多(每一個呼叫 xx.c 中函式的地方,都要在使用前宣告一下子),所以用 #include "xx.h" 這個巨集就簡化了許多行程式碼——讓前處理器自己替換好了。也就是說,xx.h 其實只是讓需要寫 xx.c 中函式宣告的地方呼叫(可以少寫幾行字),至於 include 這個 .h 檔案是誰,是 .h 還是 .c,還是與這個 .h 同名的 .c,都沒有任何必然關係。   這樣你可能會說:啊?那我平時只想呼叫 xx.c 中的某個函式,卻 include了 xx.h 檔案,豈不是巨集替換後出現了很多無用的宣告?沒錯,確實引入了很多垃圾,但是它卻省了你不少筆墨,並且整個版面也看起來清爽的多。魚與熊掌不可得兼,就是這個道理。反正多些宣告(.h一般只用來放宣告,而放不定義,參見拙著“過馬路,左右看”)也無害處,又不會影響編譯,何樂而不為呢? 翻回頭再看上面的3個問題,很好解答了吧?

答:不一定。這個例子中顯然是多餘的。但是如果.c中的函式也需要呼叫同個.c中的其它函式,那麼這個.c往往會include同名的.h,這樣就不需要為宣告和呼叫順序而發愁了(C語言要求使用之前必須宣告,而include同名.h一般會放在.c的開頭)。有很多工程甚至把這種寫法約定為程式碼規範,以規範出清晰的程式碼來。  答:1中已經回答過了。  答:不會。問這個問題的人絕對是概念不清,要不就是想混水摸魚。非常討厭的是中國的很多考試出的都是這種爛題,生怕別人有個清楚的概念了,絕對要把考生搞暈。