C 中允许的字符作为宏参数

问题描述 投票:0回答:1

我非常确定这个答案是重复的,但我找不到任何相关的内容,所以......我有这样一个宏:

#define MACRO(x) #x

是否允许做类似的事情:

const char *var = MACRO(file.);

const char *var = MACRO(.ext);

或同时使用两个点:

const char *var = MACRO(.field.);

GCC
clang
确实可以编译并正确运行它,但是根据C标准,宏参数中允许使用哪些字符。是否存在我不能使用的字符或允许使用任何 ASCII 字符? C标准的哪一段是这么说的?

c macros language-lawyer
1个回答
0
投票

在 C 中,您几乎可以在宏参数中使用任何字符,包括点或其他特殊字符。这是因为当您使用宏时,它只会接受您提供的任何内容并按原样使用它。宏中的 # 是一个特殊的东西,它将你的参数转换为字符串,但它并不真正关心字符是什么。

C 标准的主要规则是,传递给宏的任何内容都应该对预处理器有意义。这意味着您不能使用会混淆它的内容,例如一半的评论或不匹配的引号。但常规字符,包括点等特殊字符,完全没问题。

因此,对于带有点的示例,这一切都很好,并且应该适用于任何遵循标准规则的 C 编译器。标准在有关宏及其如何替换内容的部分中讨论了这一点(第 6.10.3 节及其小节,尤其是 6.10.3.2 中有关 # 运算符的部分)。

© www.soinside.com 2019 - 2024. All rights reserved.