天天看點

C/C++ 宏中的 #、#@、##的作用

宏中的#

功能是将其後面的宏參數進行字元串化操作(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__的不同,前将帶雙引号,後一個沒有雙引号。