宏中的# | 功能是将其後面的宏參數進行字元串化操作(Stringizing operator), 簡單說就是在它引用的宏變量的左右各加上一個雙引号。 | #define STRING(x) #x 下面二條語句就等價。 char *pChar = "hello"; char *pChar = STRING(hello); |
宏中的#@ | 加單引号(Charizing Operator) | #define makechar(x) #@x char ch = makechar(b);與char ch = 'b';等價。 |
宏中的## | 它可以拼接符号(Token-pasting operator)。 | #define paster( n ) printf( "token"#n" = %d\n", token##n ) int token9 = 100; 再調用 paster(9);宏展開後token##n直接合并變成了token9。整個語句變成了 printf( "token""9"" = %d", token9 ); 在C語言中字元串中的二個相連的雙引号會被自動忽略,于是上句等同于 printf("token9 = %d", token9);。 即輸出token9 = 100 |
有小問題要注意,宏中遇到#或##時就不會再展開宏中嵌套的宏了。比如使用char *pChar =STRING(__FILE__);
雖然__FILE__本身也是一個宏,但編譯器不會展開它,是以pChar将指向"__FILE__"而不是你要想的形如"D:\XXX.cpp"的源檔案名稱。
是以要加一個中間轉換宏,先将__FILE__解析成"D:\XXX.cpp"字元串。
定義如下所示二個宏:
#define _STRING(x) #x
#define STRING(x) _STRING(x)
再調用下面語句将輸出帶""的源檔案路徑
char* pChar = STRING(__FILE__);
printf("%s %s\n", pChar, __FILE__);
可以比較下STRING(__FILE__)與__FILE__的不同,前将帶雙引号,後一個沒有雙引号。