宏中的#的功能是將其后面的宏參數進行字符串化操作(Stringizing operator),簡單說就是在它援用的宏變量的左右各加上1個雙引號。
如定義好#define STRING(x) #x以后,下面2條語句就等價。
char *pChar = "hello";
char *pChar = STRING(hello);
還有1個#@是加單引號(Charizing Operator)
#define makechar(x) #@x
char ch = makechar(b);與char ch = 'b';等價。
但有小問題要注意,宏中遇到#或##時就不會再展開宏中嵌套的宏了。甚么意思了?比如使用char *pChar =STRING(__FILE__);雖然__FILE__本身也是1個宏,但編譯器不會展開它,所以pChar將指向"__FILE__"而不是你要想的形如"D:XXX.cpp"的源文件名稱。因此要加1個中間轉換宏,先將__FILE__解析成"D:XXX.cpp"字符串。
定義以下所示2個宏:
#define _STRING(x) #x
#define STRING(x) _STRING(x)
再調用下面語句將輸出帶""的源文件路徑
char* pChar = STRING(__FILE__);
printf("%s %s ", pChar, __FILE__);
可以比較下STRING(__FILE__)與__FILE__的不同,前將帶雙引號,后1個沒有雙引號。
本文參考: