【发布时间】:2015-04-27 15:41:05
【问题描述】:
如下c代码:
#define __xstr(s) __str(s)
#define __str(s) #s
#s 是什么意思?
【问题讨论】:
-
除非它是实现的一部分,否则它具有未定义的行为。以两个下划线开头的标识符,或以一个下划线后跟一个大写字母开头的标识符是保留的。
如下c代码:
#define __xstr(s) __str(s)
#define __str(s) #s
#s 是什么意思?
【问题讨论】:
# 运算符(称为“字符串化运算符”)将标记转换为字符串,适当地转义任何引号或反斜杠。
例子:
#define str(s) #s
str(p = "foo\n";) // outputs "p = \"foo\\n\";"
str(\n) // outputs "\n"
如果要对宏参数的展开进行字符串化,则必须使用两级宏:
#define xstr(s) str(s)
#define str(s) #s
#define foo 4
str (foo) // outputs "foo"
xstr (foo) // outputs "4"
最后一个示例中的代码与问题中的代码非常接近。请注意,正如 @KeithThompson 所述,“以下划线开头的标识符,或下划线后跟大写字母的标识符是保留的”。
【讨论】:
宏允许做字符串化,即将宏参数转换成字符串:
__xstr(foo) 产生"foo"
__xstr(4) 产生"4"
和
#define BLA bar
__xstr(BLA) 产生"bar"
您需要两个级别的宏来实现这一点,请参阅此处了解更多信息:
【讨论】: