預編譯

預編譯

預編譯又稱為預處理,是做些代碼文本的替換工作。是整個編譯過程的最先做的工作。

基本介紹

  • 中文名:預編譯
  • 外文名:Precompiling
  • 別稱:又稱為預處理
  • 釋義:是做些代碼文本的替換工作
  • 編譯指令:由編譯器進行的操作
釋義,編譯指令,

釋義

預編譯又稱為預處理,是做些代碼文本的替換工作。
處理#開頭的指令,比如拷貝#include包含的檔案代碼,#define宏定義的替換,條件編譯
就是為編譯做的預備工作的階段
主要處理#開始的預編譯指令

編譯指令

預編譯指令指示了在程式正式編譯前就由預編譯器進行的操作,可以放在代碼中任意行,一條預編譯指令占用一行。常見的預編譯指令有:
(1)#include 指令
該指令指示編譯器將xxx.xxx檔案的全部內容插入此處。若用<>括起檔案則在系統的INCLUDE目錄中尋找檔案,若用" "括起檔案則在當前目錄中尋找檔案。一般來說,該檔案是後綴名為"h"或"hpp"的頭檔案。
注意:<>不會在當前目錄下搜尋頭檔案,如果我們不用<>而用""把頭檔案名稱擴起,其意義為先在當前目錄下搜尋頭檔案,再在系統默認目錄下搜尋。
(2)#define指令
該指令有三種用法:
第一種是定義標識,標識有效範圍為本翻譯單元本指令之後,形如#define XXX,常與#if配合使用;
第二種是定義常數,如#define max 100,則max代表100(這種情況下使用const定義常數更好,原因見注1);
第三種是定義"函式",如#define get_max(a, b) ((a)>(b)?(a):(b)) 則以後使用get_max(x,y)就可以得到x和y中較大的數(這種方法存在一些弊病,見注2)。
第四種是定義"宏函式",如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用時,用GEN_FUN(int),則此處預編譯後就變成了 max_int(int a,int b){return a>b?a:b;},以後就可以使用max_int(x,y)就可以得到x和y中較大的數.比第三種,增加了類型的說明。
(3)#if、#else和#endif指令
這些指令一般這樣配合使用:
#if defined(標識) //如果定義了標識
要執行的指令
#else
要執行的指令
#endif
在頭檔案中為了避免重複調用(比如說兩個頭檔案互相包含對方),常採用這樣的結構:
#if !(defined XXX) //XXX為一個在你的程式中唯一的標識符
//每個頭檔案的標識符都不應相同。
//起標識符的常見方法是若頭檔案名稱為"abc.h"
//則標識為"abc_h"
#define XXX
真正的內容,如函式聲明之類
#endif
注1:因為:const常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查,而對後者只進行字元替換,沒有類型安全檢查,並且在字元替換時可能會產生意料不到的錯誤(邊際效應)。
注2:例如get_max(a++, b)時,a++會被執行多少次取決於a和b的大小!所以建議還是用內聯函式而不是這種方法提高速度。雖然有這樣的弊病,但這種方法的確非常靈活,因為a和b可以是各種數據類型。
注3:可以查看中文百科的預處理命令,編排的比較簡明。

相關詞條

熱門詞條

聯絡我們