編譯一個C程序的第1個步驟是預處理(preprocessing)階段。C預處理器在源代碼編譯以前對其進行一些文本性質的操做。它的主要任務包括刪除註釋、插入被#include指令包含的文件的內容、定義和替換由#define指令定義的符合以及肯定代碼的部份內容是否應該根據一些條件編譯指令進行編譯。express
用法:函數
#define name stuff測試
有了這條指令之後,每當有符合name出如今這條指令後面時,與處理器就會把它替換成stuffspa
全部用於對數值表達式進行求值的宏定義都應該整個表達式兩邊加上一對括號。調試
使用#undef移除一個宏定義。code
#if constant-expressionblog
statementsio
#endif編譯
其中,constant-expression(常量表達式)由預處理器進行求值,若是它的值非零值(真), 那麼statements部分就被正常編譯,不然預處理器就安靜第刪除它們。class
例如,將你全部的調試代碼都如下面這種形式出現:
#if DEBUG printf("x=%d, y=%d\n",x,y); #endif
這樣,無論咱們是想編譯仍是忽略這個代碼都很容易辦到。若是想要編譯它,只要使得
#define DEBUG 1
這個符號定義就能夠了。若是想要忽略它,只要把這個符號定義爲0就能夠了。
條件編譯的另外一個用途是在編譯時選擇不一樣的代碼部分。爲了支持這個功能,#if指令還具備可選的#elif和#else子句。
測試一個符號是否已被定義:
#ifdef symbol
#ifndef symbol
#include指令使另外一個文件的內容被編譯。替換方式:預處理器刪除這條指令,並用包含文件的內容取而代之。這樣,一個頭文件若是被包含到10個源文件中,它實際上被編譯了10次。
開銷問題:若是兩個源文件都須要同一組聲明,把這些聲明覆制到每一個源文件中所花費的編譯時間跟把這些聲明放入一個頭文件,而後再用#include指令把它包含於每一個源文件所花費編譯時間相差無幾。同時,這種開銷只是在程序被編譯時才存在,因此對運行時效率並沒有影響。更重要的是,把這些聲明放於一個頭文件中具備重要的意義。
因此,和把一個程序須要的全部聲明都放入一個巨大的頭文件相比,使用幾個頭文件,每一個頭文件包含於某個特定函數或模塊 。