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