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