程式設計好習慣 精確包含標頭檔案

2021-06-21 05:13:39 字數 2104 閱讀 8421

本文出自 「

至簡李雲

」 部落格,請務必保留此出處

請注意這裡用的是「精確」而不是「正確」,之所以不說正確,那是因為如果標頭檔案沒有被正確地包含的話,編譯器是不會生成最終的目標**的。那用精確一詞想表達除正確之外的什麼意思呢?包含兩層意思。

第一層意思是,只包含必需的標頭檔案。圖1是乙個簡單的示例程式,先讓我們假設這個檔案只有foo()乙個函式的實現,在foo()函式中也只有簡單的一行列印語句。我們知道printf()函式的原型宣告**於標準庫的stdio.h標頭檔案,foo.c檔案中除了包含stdio.h外還包含了另外乙個多餘的標頭檔案 —— time.h,從實現的角度來看沒有問題。但是當乙個專案很大的時候,這種類似的行為會突顯出編譯效率低下這一問題。當foo.c檔案在被編譯時,第一步要做的是預處理,預處理的最終結果可以看作是將stdio.h和time.h中的內容全部放到foo.c檔案中,當然,如果stdio.h和time.h中又包含其它的標頭檔案的話,它們也都全部會被放入到最終的foo.c檔案中,圖2示例了採用gcc的-e選項所獲得的最終預處理完的檔案final.c,從圖中可以看出,本來是7行的檔案變成了1419行,這意味著什麼?意味著如果多包含標頭檔案則編譯所花費的時間將更長。因為,編譯器在最終分析final.c檔案中的詞法和語法時,它必須從頭到尾一行一行的處理。千萬別小看對於每乙個檔案多出來的那麼一點點時間,當乙個專案有幾十萬行**時,所多出來的時間就不可小視了。往往當這種現象成為了乙個不可忽視的問題時,要消除它所需付出的努力已經很大了,甚至是專案組不可承受的。另外,這種糾正行為大多是「體力勞動」。

foo.c

#include

#include

void foo ()

圖1

yunli.blog.51cto.com~

$ gcc -e foo.c >final.c

yunli.blog.51cto.com~

$ vi final.c

1414

# 3 "foo.c" 2

1415

1416

void foo ()

1417

:set nu

圖2

第二層意思就是,盡可能不要在標頭檔案中包含其它的標頭檔案,取而代之的是盡量在.c原始檔中包含它們。對於圖3和圖4兩種實現方式,光從foo()函式的角度來說是一模一樣的,只是對於stdio.h標頭檔案的包含乙個是放在foo.h中的,而另乙個則是放在foo.c中的。大部分情形下設計乙個模組的目的是需要供其它的模組使用,而其它的模組在需要使用foo()函式時通常需要包含foo.h標頭檔案。採用圖3的實現方式將造成包含foo.h標頭檔案則會導致間接地包含stdio.h,進而出現前面所講的編譯速度下降這一問題,而圖4的實現就不存在這一問題。想想,printf()函式只是在foo()函式的實現中需要被使用,而完全可以不讓foo.h標頭檔案知道這一資訊,所以跟本就沒有必要在foo.h標頭檔案中包含stdio.h。

foo.h

#include

void foo ();

foo.c

#include 「foo.h」

void foo ()

圖3

foo.h

void foo ();

foo.c

#include

#include 「foo.h」

void foo ()

圖3

相信不少讀者有這種類似的專案經驗,即為了包含標頭檔案省事,在專案進展的過程中定義乙個包羅永珍的公共標頭檔案,然後讓其它的源程式檔案只需包含這乙個標頭檔案就行了,從而省去在建立乙個新源程式時考慮哪些要包含、哪些不用包含這一過程。看完這則程式設計好習慣後,相信讀者會明白那並不是一種好的實踐。

本文出自 「至簡李雲」 部落格,請務必保留此出處

程式設計好習慣 精確包含標頭檔案

請注意這裡用的是 精確 而不是 正確 之所以不說正確,那是因為如果標頭檔案沒有被正確地包含的話,編譯器是不會生成最終的目標 的。那用精確一詞想表達除正確之外的什麼意思呢?包含兩層意思。第一層意思是,只包含必需的標頭檔案。圖1是乙個簡單的示例程式,先讓我們假設這個檔案只有foo 乙個函式的實現,在fo...

精確包含標頭檔案

原文 將原文精簡了一下 一 只包含必需的標頭檔案。當foo.c檔案在被編譯時,第一步要做的是預處理,預處理的最終結果可以看作是將stdio.h和time.h中的內容全部放到foo.c檔案中,當然,如果stdio.h和time.h中又包含其它的標頭檔案的話,它們也都全部會被放入到最終的foo.c檔案中...

程式設計好習慣 減少搜尋標頭檔案的目錄數

假設存在下圖所示的專案目錄結構。如果存在如下包含標頭檔案的 則大多的專案中需要通過 i foo 和 i bar 指明兩個搜尋標頭檔案的目錄。1 2 foo.c include bar.h 1 2 bar.c include foo.h 然而,當專案規模很大存在很多的目錄時,這種方式將顯著地降低專案的...