處理#開頭的指令,比如拷貝#include包含的檔案**,#define巨集定義的替換,條件編譯等
就是為編譯做的預備工作的階段
主要處理#開始的預編譯指令
預編譯指令指示了在程式正式編譯前就由編譯器進行的操作,可以放在程式中的任何位置。常見的預編譯指令有:
(1)#include 指令
該指令指示編譯器將***.***檔案的全部內容插入此處。若用<>括起檔案則在系統的include目錄中尋找檔案,若用" "括起檔案則在當前目錄中尋找檔案。一般來說,該檔案是字尾名為"h"或"hpp"的標頭檔案。
注意:<>不會在當前目錄下搜尋標頭檔案,如果我們不用<>而用""把頭檔名擴起,其意義為在先在當前目錄下搜尋標頭檔案,再在系統預設目錄下搜尋。
(2)#define指令
該指令有三種用法:
第一種是定義標識,標識有效範圍為整個程式,形如#define ***,常與#if配合使用;
第二種是定義常數,如#define max 100,則max代表100(這種情況下使用const定義常數更好,原因見註1);
第三種是定義"函式",如#define get_max(a, b) ((a)>(b)?(a):(b)) 則以後使用get_max(x,y)就可以得到x和y中較大的數(這種方法存在一些弊病,見註2)。
(3)#if、#else和#endif指令
這些指令一般這樣配合使用:
#if defined(標識) //如果定義了標識
要執行的指令
#else
要執行的指令
#endif
在標頭檔案中為了避免重複呼叫(比如說兩個標頭檔案互相包含對方),常採用這樣的結構:
#if !(defined ***) //***為乙個在你的程式中唯一的識別符號,
//每個標頭檔案的識別符號都不應相同。
//起識別符號的常見方法是若頭檔名為"abc.h"
//則標識為"abc_h"
#define ***
真正的內容,如函式宣告之類
#endif
注1:因為:const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤(邊際效應)。
注2:例如get_max(a++, b)時,a++會被執行多少次取決於a和b的大小!所以建議還是用內聯函式而不是這種方法提高速度。雖然有這樣的弊病,但這種方法的確非常靈活,因為a和b可以是各種資料型別。
什麼是預編譯
預編譯頭的概念 所謂的預編譯頭就是把乙個工程中的那一部分 預先編譯好放在乙個檔案裡 通常是以.pch為副檔名的 這個檔案就稱為預編譯標頭檔案這些預先編譯好的 可以是任何的c c 甚至是inline的函式,但是必須是穩定的,在工程開發的過程中不會被經常改變。如果這些 被修改,則需要重新編譯生成預編譯標...
什麼是預編譯?
文章 一 處理 開頭的指令,比如拷貝 include包含的檔案 define巨集定義的替換,條件編譯等 就是為編譯做的預備工作的階段 主要處理 開始的預編譯指令 預編譯指令指示了在程式正式編譯前就由編譯器進行的操作,可以放在程式中的任何位置。常見的預編譯指令有 1 include 指令 該指令指示編...
什麼是預編譯?何時需要預編譯?
什麼是預編譯 預編譯又稱為預處理 是做些 文字的替換工作。處理以 開頭的指令 比如拷貝 include 包含的檔案 define 巨集定義的替換 條件編譯等,就是為編譯做的預備工作的階段。主要處理 開始的預編譯指令,預編譯指令指示了在程式正式編譯前就由編譯器進行的操作,可以放在程式中的任何位置。c ...