「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...