我非常确定这个答案是重复的,但我找不到任何相关的内容,所以......我有这样一个宏:
#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 中,您几乎可以在宏参数中使用任何字符,包括点或其他特殊字符。这是因为当您使用宏时,它只会接受您提供的任何内容并按原样使用它。宏中的 # 是一个特殊的东西,它将你的参数转换为字符串,但它并不真正关心字符是什么。
C 标准的主要规则是,传递给宏的任何内容都应该对预处理器有意义。这意味着您不能使用会混淆它的内容,例如一半的评论或不匹配的引号。但常规字符,包括点等特殊字符,完全没问题。
因此,对于带有点的示例,这一切都很好,并且应该适用于任何遵循标准规则的 C 编译器。标准在有关宏及其如何替换内容的部分中讨论了这一点(第 6.10.3 节及其小节,尤其是 6.10.3.2 中有关 # 运算符的部分)。