作用:將巨集定義中的傳入引數名轉換成用一對雙引號括起來引數名字串。其只能用於有傳入引數的巨集定義中,且必須置於巨集定義體中的引數名前。
如: #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...