什麼是預編譯?

2021-07-25 06:31:58 字數 1238 閱讀 8104

處理#開頭的指令,比如拷貝#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 ...