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