宏中的#的功能是将其后面的宏参数进行字符串化操作(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个没有双引号。
本文参考: