巨集定義中的

2021-09-08 03:14:16 字數 1498 閱讀 5558

劉詩慧rubby的日誌

1、# 

(stringizing

)字串化操作符

作用:

將巨集定義中的傳入引數名轉換成用一對雙引號括起來引數名字串。其只能用於有傳入引數的巨集定   義中,且必須置於巨集定義體中的引數名前。

如: #define example(instr) printf("the input string is:\t%s\n",#instr)

#define example1(instr) #instr

當使用該巨集定義時:

example(abc);  在編譯時將會展開成:

printf("the input string is:\t%s\n","abc");

string str=example1(abc);  將會展成:

string str="abc"

;*注意:

對空格的處理:

a、忽略傳入引數名前面和後面的空格。

如:str=example1(   abc )

; 將會被擴充套件成 

str="abc"

;b、當傳入引數名間存在空格時,編譯器將會自動連線各個子字串,用每個子字串之間以乙個空格連線,忽略剩餘空格。

如:str=exapme( abc    def); 

將會被擴充套件成 

str="abc def";2、

## (

token-pasting

)符號連線操作符

作用:將巨集定義的多個形參轉換成乙個實際引數名。

如: #define examplenum(n) num##n

int num9=9;

使用:int num=examplenum(9); 將會擴充套件成 

int num=num9;

注意:

a、當用

##連線形參時,

##前後的空格可有可無。

如:#define examplenum(n) num ## n 

相當於 

#define examplenum(n) num##n

b、連線後的實際引數名,必須為實際存在的引數名或是編譯器已知的巨集定義。

另:如果##後的引數本身也是乙個巨集的話,##會阻止這個巨集的展開。

#define strcpy(a, b)   strcpy(a ## _p, #b)

int main()

3、#@

(charizing

)字元化操作符

作用:將傳入單字元引數名轉換成字元

,以一對單引用括起來。如:

#define makechar(x)  #@x

a = makechar(b);

展開後變成了:

a= 'b';

續行操作符

當定義的巨集不能用一行表達完整時,可以用""

表示下一行繼續此巨集的定義。注意\前留空格。

參考**:

巨集定義中的

以這個巨集定義為例 define err exit m do while 0 其中的 是怎麼回事?1 對於有引數的巨集定義,巨集定義時,在巨集名與帶引數的括號之間不應加空格,否則將空格以後的字元都作為替代字串的一部分。2 帶引數的巨集定義只是進行簡單的字元替換,巨集展開則是在編譯前進行的,在展開時並...

巨集定義中的

劉詩慧rubby的日誌 1 stringizing 字串化操作符 作用 將巨集定義中的傳入引數名轉換成用一對雙引號括起來引數名字串。其只能用於有傳入引數的巨集定 義中,且必須置於巨集定義體中的引數名前。如 define example instr printf the input string is...

c 中的巨集定義

一 不帶引數的巨集定義 巨集定義又稱為巨集代換 巨集替換,簡稱 巨集 格式 define 識別符號 字串 其中的識別符號就是所謂的符號常量,也稱為 巨集名 預處理 預編譯 工作也叫做巨集展開 將巨集名替換為字串。掌握 巨集 概念的關鍵是 換 一切以換為前提 做任何事情之前先要換,準確理解之前就要 換...