聊聊C語言的預編譯指令include

2021-07-25 16:55:38 字數 2018 閱讀 3591

「include」相信大家不會陌生,在我們寫**時,開頭總會來一句「include ***」。include是幹嘛用的,很多教材都提到了,因此這裡不會再詳細解釋了,大概意思就是將**檔案需要用到的函式宣告、常量等包含到**檔案中。include不是c語言的關鍵字,而是屬於一種預編譯的指令,那麼預編譯又是個什麼東東,這也是本文要詳細闡述的內容。

為了更好地闡述預編譯的概念,我們先來看一段**。有乙個標頭檔案,叫「mycode.h」,內容如下:

mycode.h檔案內容:

int function(int a);

int function(int a)

在mycode.h檔案中,我們宣告了乙個函式function,它帶有乙個整型的形參,返回值也是乙個整型值,並且實現了這個函式。我們再寫乙個**檔案,叫「mycode.c」,內容如下:

mycode.c檔案內容:

#include

#include "mycode.h"

int main()

在mycode.c中,我們使用include包含了mycode.h標頭檔案,並且呼叫了function函式。在visual c++ 6.0上編譯,結果如下:

在vc編譯之前,會有乙個預編譯的過程,即

#include "mycode.h

"這一語句會將mycode.h中的

內容插入到相應的位置,那麼預編譯之後,mycode.c如下:

...........

int function(int a);

int function(int a)

int main()

預編譯完了後,vc會繼續編譯main函式

**。說到這裡,也許你還沒看出預編譯的用處,別急,我們現在修改下mycode.c中的main函式體,在呼叫function時,引數是a+1,如下:

#include

#include "mycode.h"

int main()

我們再來編譯,結果如下:

這次編譯中,由於mycode.h沒有做任何修改,而且之前也已經編譯過一次,因此,

mycode.h本次不會再次編譯。但是main函式中做了修改,因此,main函式部分會再次編譯, 這就省去了mycode.h的編譯時間。試想,如果mycode.h中有很多的函式宣告,很多的函式實現,很多的變數、常量定義,很多的巨集,mycode.c中也包含了很多的標頭檔案,那麼,只要預編譯一次這些標頭檔案,以後不管怎麼修改main函式,再次編譯時,是不是能夠省去很多的時間?這就是預編譯的好處。當然,如果標頭檔案也被修改了,那麼標頭檔案還是要重新編譯的。

說到這裡,有人可能發現了,**中有

#include 和

#include "mycode.h",標頭檔案乙個用<>包含,乙個用「」包含,兩者有什麼區別呢?

對於使用<> 來包含標頭檔案的方式,編譯器會去系統目錄中尋找標頭檔案,而這個系統目錄的位置,可以由你手動配置,也可以由編譯器預設。比如,在vc中的配置方式如下:

這裡指明了標頭檔案在「d:\softwares\microsoft visual studio\vc98

」位置,這是vc安裝時預設指定的。而「d:\ccode\mysql\mysql-5.6.24-win32\include

」是我安裝mysql時,我自己配置的。如果編譯器在上述目錄中都找不到標頭檔案

stdio.h

的話,就會報錯!

對於使用「」來包含標頭檔案的方式,編譯器會去當前編譯的**檔案路徑下找。比如,mycode.c所在目錄是「d:\ccode\test

」,則編譯器會去「d:\ccode\test

」尋找mycode.h,如果找不到,就會去上述系統目錄中找,如果還找不到,就會報錯!

C 預編譯指令

下面對c 中的預編譯指令進行介紹 1.define和 undef 用法 define debug undef debug define告訴編譯器,我定義了乙個debug的乙個符號,他類似乙個變數,但是它沒有具體的值,可以將它看為乙個符號而已。undef就是刪除這個符號的定義。如果符號debug沒定義...

c 的預編譯指令

c 預處理器指令是在編譯時呼叫的。預處理器指令 preprocessor directive 告訴c 編譯器要編譯哪些 並指出如何處理特定的錯誤和警告。c 預處理器指令還可以告訴c 編輯器有關 組織的資訊。1.定義符號和取消符號定義的預處理指令 define 和 undef 預處理指令都以 號開頭並...

c語言中條件編譯相關的預編譯指令

條件編譯是根據實際定義巨集 某類條件 進行 靜態編譯的手段。可根據表示式的值或某個特定巨集是否被定義來確定編譯條件。最常見的條件編譯是防止重複包含標頭檔案的巨集,形式跟下面 類似 1 ifndef abcd h 2 define abcd h34 some declaration codes56 e...