通常的做法是定义字符串化的宏,如:
#define str(token) #token
#define xstr(token) str(token)
为什么通常使用x
前缀? “x”有什么意义吗?
(我的猜测可能是它代表“扩展”(如果有的话),但我没有证据支持这一点。)
答案 0 :(得分:2)
正如其他人所建议的那样,x
似乎用于扩展,或者我也看到扩展。 GNU的一篇关于Stringizing的文章提到了这种用法。
他们将其描述为:
"如果你想对结果进行字符串化[...], 你必须使用两个级别的宏。"
#define xstr(s) str(s)
#define str(s) #s
#define foo 4
str (foo)
→ "foo"
xstr (foo)
→ xstr (4)
→ str (4)
→ "4"
他们继续声明:
在str中使用时," s是字符串化的,因此它不是宏扩展 第一。但是s是xstr的普通参数,所以它完全是 在xstr本身扩展之前进行宏扩展(参见Argument Prescan)。 因此,在str得到它的论证时,它已经存在了 宏扩展"
虽然这些都不具体,但我认为您可以安全地假设x是扩展/扩展使用。
答案 1 :(得分:0)
当我在宏或函数调用名称前面使用x
时,我用它来表示扩展用法,我想我并不孤单。
对于您的示例,可以使用str
对token
进行字符串化,但应使用xstr
进行扩展使用,即扩展宏参数并对该结果进行字符串化。
为了比较,当大部分时间只使用其中一个宏而另一个用于内部实现时,我会这样做:
#define _str(token) #token
#define str(token) _str(token)