典型的xstr宏中“x”是什么意思?

时间:2018-01-24 10:57:59

标签: c c-preprocessor naming-conventions

通常的做法是定义字符串化的宏,如:

#define str(token) #token
#define xstr(token) str(token)

为什么通常使用x前缀? “x”有什么意义吗?

(我的猜测可能是它代表“扩展”(如果有的话),但我没有证据支持这一点。)

2 个答案:

答案 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时,我用它来表示扩展用法,我想我并不孤单。

对于您的示例,可以使用strtoken进行字符串化,但应使用xstr进行扩展使用,即扩展宏参数并对该结果进行字符串化。 为了比较,当大部分时间只使用其中一个宏而另一个用于内部实现时,我会这样做:

#define _str(token) #token
#define str(token) _str(token)