C語言巨集定義中的 , , 及 符號的作用

2021-07-04 12:12:55 字數 2994 閱讀 2569

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

如: #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";

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

如:#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、連線後的實際引數名,必須為實際存在的引數名或是編譯器已知的巨集定義。

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

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

int main()

結果:

var1 = var2

var2 = var1

作用:將傳入單字元引數名轉換成字元,以一對單引用括起來。

如:#define makechar(x)     #@x

a = makechar( b );

展開後變成了:

a = 'b';

當定義的巨集不能用一行表達完整時,可以用"\"表示下一行繼續此巨集的定義。

注意 \ 前留空格。

需要注意的是凡

巨集定義裡有用'#'或'##'的地方巨集引數是不會再展開

.

1, 非'#'和'##'的情況

#define tow       (2) 

#define mul(a,b) (a*b) 

printf("%d*%d=%d\n", tow, tow, mul(tow,tow)); 

這行的巨集會被展開為: 

printf("%d*%d=%d\n", (2), (2), ((2)*(2))); 

mul裡的引數tow會被展開為(2). 

2, 當有'#'或'##'的時候

#define a           (2) 

#define str(s)      #s 

#define cons(a,b)   int(a##e##b) 

printf("int max: %s\n",   str(int_max));     // int_max #i nclude

這行會被展開為: 

printf("int max: %s\n", "int_max"); 

printf("%s\n", cons(a, a));                // compile error  

這一行則是: 

printf("%s\n", int(aea)); 

int_max和a都不會再被展開,然而解決這個問題的方法很簡單. 加多一層中間轉換巨集.

加這層巨集的用意是把所有巨集的引數在這層裡全部展開

加這層巨集的用意是把所有巨集的引數在這層裡全部展開, 那麼在轉換巨集裡的那乙個巨集(_str)就能得到正確的巨集引數.

#define a            (2) 

#define _str(s)      #s 

#define str(s)       _str(s)           // 轉換巨集 

#define _cons(a,b)   int(a##e##b) 

#define cons(a,b)    _cons(a,b)        // 轉換巨集 

printf("int max: %s\n", str(int_max));           // int_max,int型的最大值,為乙個變數 #i nclude 

輸出為: int max: 0x7fffffff 

str(int_max) -->   _str(0x7fffffff) 然後再轉換成字串; 

printf("%d\n", cons(a, a)); 

輸出為:200 

cons(a, a)   -->   _cons((2), (2))   --> int((2)e(2)) 

C語言巨集定義中的 , , 及 符號的作用

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

define巨集定義中的 , , 及 符號

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

define巨集定義中的 , , 及 符號

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