C 快速入門 十六 預編譯處理命令

2021-06-12 20:32:13 字數 3529 閱讀 9563

(1). 巨集的用途

c++中可以使用預處理命令建立巨集。而巨集的主要用途有,

(2). 巨集替換

巨集替換是指將**中的字元,預處理時替換為指定字串。 c++中使用預處理命令 #define 定義巨集替換。其語法為:

c++中的巨集替換是將引用巨集名的地方直接替換為其後的字串,而不做其他處理。如下邊的示例,其中 巨集n只是用巨集n定義的字串 替換和填充了 n所在的位置,巨集替換完成後其**為 a = 2+2 * 2+2 = 8

#define

h 2+2

void main()

雖然有引數的巨集看起來像函式呼叫,但其實質還是簡單的字元替換,

#defineh(a,b) a+b

void main()

(3). 巨集替換中的三個特殊符號

預處理命令 #define 中可以使用 3 個 特殊符號: #,##,#@

有了這三個特殊符號,使巨集替換變得非常靈活。比如 我們要將某個變數名以字串輸出可以直接使用 含有 特殊符號# 的巨集即可

#definevartostring (n)cout <<#n" = "

<< n

....

intnum = 456;

vartostring (num);

// return: num = 456;

特殊符號 ##也很有用,比如有時需要使用巨集將現有變數名替換為其他名稱 ,這時就需要用到 特殊符號 ##,

#define

vartostring

( n ) cout <<

"token"#n

" = "

<<token##n<< endl;

....

inttoken10=10086;

vartostring(10);

//return token10 =10086

另外在很多 c++ **的巨集定義中都會見到反斜槓<\>,其作用是銜接上下兩行使其當作一行(一條語句)處理。

(4). 刪除使用#define 定義的巨集 #undef

使用預定義命令 #undef 可以刪除指定的巨集

#define

vartostring

( n ) .....

.....

#undef

vartostring

(5). 條件編譯

條件編譯的作用是在預編譯時決定哪些**需要被編譯,而哪些是不被編譯的。在c++可以用一組預編譯命令實現條件編譯,而條件編譯的依據為某個巨集或該巨集的整數常量值

(6). #ifdef 和 #ifndef 

#ifdef 和 #ifndef只判斷巨集是否存在

#define

strict

#ifdef strict

cout <<

"會被編譯

"<< endl;

//會被編譯

#endif

// strict

#ifndef strict

cout <<

"不會被編譯"

<< endl; 

//不會被編譯

#endif 

// strict

(7). #if defined() 

和 #if !defined() 

他們和 

#ifdef 和 #ifndef 的作用一樣,都是判斷巨集是否存在,

#define

strict

#if

defined (strict )

cout <<

"會被編譯"

<< endl;

//會被編譯

#endif

// strict

#if !defined (strict )

cout <<

"不會被編譯"

<< endl; 

//不會被編譯

#endif 

// strict

(8). #if 、#elif 和 #else 

和c++中的 if 條件語言一樣,只有當 #if 後的表示式最終結果為 true (表示式最終結果非 0)時,其後到下乙個配套的預處理命令之間的**會被編譯。  

另外 預處理命令 

#else 和 條件語句中的 else 功能相同。 #elif

和 條件語句中的 else if 功能相同。

#define

strict 5

#if

strict

cout <<

"會被編譯"

<< endl;

//會被編譯

#else

cout <<

"不會被編譯"

<< endl; 

//不會被編譯

#endif

#if (strict == 10)

cout <<

"不會被編譯"

<< endl; 

//不會被編譯

#else

cout <<

"會被編譯"

<< endl;

//會被編譯

#endif

需要注意的是:c++ 判別式最終值為 0 時,才為 false ,其他結果都為 ture,即便 判別式最終值負數,結果也為 ture。 

(9). 總結

巨集有很多缺點,比如不支援型別檢查,作用域不清晰等,但因為其便捷性還是被大量使用。特別是一些開發框架。

最後總結一下c++巨集及巨集替換的特點:

(1). #include

預處理命令 #include 用來引人指定標頭檔案(基本等同於 c# 的 using 引入命名空間 的概念)。其語法為

前者會從當前目錄開始查詢指定標頭檔案,多用於引用自定義標頭檔案,後者會從標準庫目錄開始查詢。多用於引用庫檔案。

(2). #error

該預處理命令可以在預處理時丟擲錯誤。

#define

xx  1

#ifxx

#error

預編譯時會丟擲該錯誤 

#endif

c++中還有很多已經預定好的巨集,

(1). 符合ansi的預定義巨集:

(2). 

參考資料:

-出處:

-

預編譯處理命令

if endif是c 種的條件編譯預處理命令 有兩種格式 1 ifdef 標示符 程式段1 else 程式段2 endif 表示 如果標示符已經被 define命令定義過,則編譯程式段1,否則編譯程式段2 2 if 表示式 程式段1 else 程式段2 endif 表示 如果表示式為真,則編譯程式段...

c 預編譯處理

定義 預編譯又稱為預處理 是做些 文字的替換工作。處理 開頭的指令 比如拷貝 include 包含的檔案 define 巨集定義的替換 條件編譯等,就是為編譯做的預備工作的階段,主要處理 開始的預編譯指令,預編譯指令指示了在程式正式編譯前就由編譯器進行的操作,可以放在程式中的任何位置,其存放在記憶體...

預處理預編譯(C )

一 預處理的由來 在c 的歷史發展中,有很多的語言特徵 特別是語言的晦澀之處 來自於c語言,預處理就是其中的乙個。c 從c語言那裡把c語言預處理器 被bjarne博士簡稱為cpp,不知道是不是c program preprocessor的簡稱 繼承過來。二 常見的預處理功能 預處理器的主要作用就是把...