prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 11.17

Q我正在尝试使用 ANSI 的“字符串化”预处理器运算符 `#' 来将符号常量的值插入到消息中,但它总是字符串化宏的名称而不是它的值。


A事实证明,该定义#表示它应该立即将宏参数字符串化,而无需进一步展开(如果该参数恰好是另一个宏的名称)。您可以使用以下两步过程来强制展开并字符串化宏

#define Str(x) #x
#define Xstr(x) Str(x)
#define OP plus
char *opname = Xstr(OP);
此代码设置opname"plus"而不是"OP"。(它之所以有效,是因为Xstr()宏展开其参数,然后Str()将其字符串化。)[脚注]

当要连接两个宏的值(而不是名称)时,对于令牌粘贴运算符也需要一个等效的迂回方法##

请注意,两者###仅在预处理器宏展开期间运行。您不能在普通源代码中使用它们,只能在宏定义中使用。

参考文献:ISO Sec. 6.8.3.2, Sec. 6.8.3.5


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管