C 源代码中是否允许使用 @ 字符?
Is the @ character allowed in C source?
显然,让编译器遇到 @
字符会导致语法错误(除非它是注释或字符串文字)。但是,如果找到该字符,例如在 #if 0
块内,该程序在技术上是否有效?
我试过这个:
#define NOTHING(x)
int main()
{
NOTHING(@@@@);
return 0;
}
with -pedantic -Wall -Wextra
,在 gcc 和 clang 上都没有发出警告。我不确定这是否保证有效,或者他们是否只是没有针对它的具体警告。
我在标准中没有发现任何一种说法,这令人担忧。我不想以此为基础的工具只是为了发现符合标准的编译器会阻塞它。
您几乎可以在 C 程序中包含任何字符,只要它被预处理器消除或字符串化即可。 @ 是一个有效的预处理器标记,因此它不会在编译的预处理阶段被标记为错误。
该标准不会阻止编译器发出有关任何内容的警告,并且在这种情况下编译器可能会产生警告。但我不知道有哪个会这样做,我认为这是一个实施质量问题。
相关标准章节:
§6.4 中 preprocessing-token 的定义:"each non-white-space character that cannot be one of the above"。请注意,@@@@
因此是 四个 个预处理标记。
§6.4/2,重点补充:"Each preprocessing token that is converted to a token shall have the lexical form of a keyword, an identifier, a constant, a string literal, or a punctuator."只要@
不是"converted to a token",就没有错误发生。转换为令牌发生在编译过程的第 7 阶段(参见§5.1.1.2/7)。那是在第 4 阶段宏扩展(包括字符串化)之后很长时间。
显然,让编译器遇到 @
字符会导致语法错误(除非它是注释或字符串文字)。但是,如果找到该字符,例如在 #if 0
块内,该程序在技术上是否有效?
我试过这个:
#define NOTHING(x)
int main()
{
NOTHING(@@@@);
return 0;
}
with -pedantic -Wall -Wextra
,在 gcc 和 clang 上都没有发出警告。我不确定这是否保证有效,或者他们是否只是没有针对它的具体警告。
我在标准中没有发现任何一种说法,这令人担忧。我不想以此为基础的工具只是为了发现符合标准的编译器会阻塞它。
您几乎可以在 C 程序中包含任何字符,只要它被预处理器消除或字符串化即可。 @ 是一个有效的预处理器标记,因此它不会在编译的预处理阶段被标记为错误。
该标准不会阻止编译器发出有关任何内容的警告,并且在这种情况下编译器可能会产生警告。但我不知道有哪个会这样做,我认为这是一个实施质量问题。
相关标准章节:
§6.4 中 preprocessing-token 的定义:"each non-white-space character that cannot be one of the above"。请注意,
@@@@
因此是 四个 个预处理标记。§6.4/2,重点补充:"Each preprocessing token that is converted to a token shall have the lexical form of a keyword, an identifier, a constant, a string literal, or a punctuator."只要
@
不是"converted to a token",就没有错误发生。转换为令牌发生在编译过程的第 7 阶段(参见§5.1.1.2/7)。那是在第 4 阶段宏扩展(包括字符串化)之后很长时间。