1. 程式人生 > >聊聊C語言的預編譯指令include

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

“include”相信大家不會陌生,在我們寫程式碼時,開頭總會來一句“include XXX”。include是幹嘛用的,很多教材都提到了,因此這裡不會再詳細解釋了,大概意思就是將程式碼檔案需要用到的函式宣告、常量等包含到程式碼檔案中。include不是C語言的關鍵字,而是屬於一種預編譯的指令,那麼預編譯又是個什麼東東,這也是本文要詳細闡述的內容。為了更好地闡述預編譯的概念,我們先來看一段程式碼。有一個頭檔案,叫“MyCode.h”,內容如下: MyCode.h檔案內容:
int function(int a);

int function(int a)
{
    return a;
}
       在MyCode.h檔案中,我們聲明瞭一個函式function,它帶有一個整型的形參,返回值也是一個整型值,並且實現了這個函式。我們再寫一個程式碼檔案,叫“MyCode.c”,內容如下:
MyCode.c檔案內容:
#include <stdio.h>
#include "MyCode.h"

int main()
{
    int a = 1;
    int b = 0;
    b = function(a);
    printf("在main函式中,b的值是%d\n", b);
    return 0;
}
在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)
{
    return a;
}

int main()
{
    int a = 1;
    int b = 0;
    b = function(a);
    printf("在main函式中,b的值是%d\n", b);
    return 0;
}

預編譯完了後,VC會繼續編譯main函式程式碼。說到這裡,也許你還沒看出預編譯的用處,別急,我們現在修改下MyCode.c中的main函式體,在呼叫function時,引數是a+1,如下:
#include <stdio.h>
#include "MyCode.h"

int main()
{
    int a = 1;
    int b = 0;
    b = function(a + 1);
    printf("修改了main函式後,b的值是%d\n", b);
    return 0;
}

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


       這次編譯中,由於MyCode.h沒有做任何修改,而且之前也已經編譯過一次,因此,MyCode.h本次不會再次編譯。但是main函式中做了修改,因此,main函式部分會再次編譯, 這就省去了MyCode.h的編譯時間。試想,如果MyCode.h中有很多的函式宣告,很多的函式實現,很多的變數、常量定義,很多的巨集,MyCode.c中也包含了很多的標頭檔案,那麼,只要預編譯一次這些標頭檔案,以後不管怎麼修改main函式,再次編譯時,是不是能夠省去很多的時間?這就是預編譯的好處。當然,如果標頭檔案也被修改了,那麼標頭檔案還是要重新編譯的。
       說到這裡,有人可能發現了,程式碼中有#include <stdio.h>和
#include "MyCode.h",標頭檔案一個用<>包含,一個用“”包含,兩者有什麼區別呢?
       對於使用<> 來包含標頭檔案的方式,編譯器會去系統目錄中尋找標頭檔案,而這個系統目錄的位置,可以由你手動配置,也可以由編譯器預設。比如,在VC中的配置方式如下:


       這裡指明瞭標頭檔案在“D:\softwares\Microsoft Visual Studio\VC98”位置,這是VC安裝時預設指定的。而“D:\CCode\MySQL\mysql-5.6.24-win32\include”是我安裝MySql時,我自己配置的。如果編譯器在上述目錄中都找不到標頭檔案stdio.h的話,就會報錯!