C源中是否允许@字符?

mti*_*nic 7 c c-preprocessor

显然,让编译器遇到该@字符会导致语法错误(除非它是注释或字符串文字).但是,如果在#if 0块中找到该字符,那么该程序在技术上是否有效?

我试过这个:

#define NOTHING(x)

int main()
{
    NOTHING(@@@@);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

-pedantic -Wall -Wextra上GCC和铛,它给了没有任何警告.我不确定这是否有效,或者他们是否只是没有特定的警告.

我没有在标准中找到任何说法,但这令人担忧.我不想在此基础上找到一个工具,只是为了找出符合标准的编译器对它进行扼流.

ric*_*ici 9

您可以在C程序中包含几乎任何字符,只要它由预处理器消除或字符串化即可.@是一个有效的预处理程序标记,因此在编译的预处理阶段不会将其标记为错误.

该标准不会阻止编译器发出有关任何内容的警告,并且在这种情况下编译器可能会产生警告.但我不知道有哪一个,我认为这是一个实施质量问题.

相关标准部分:

  • 第6.4节中预处理令牌的定义:"不能是上述之一的每个非空白字符".请注意,@@@@因此有四个预处理令牌.

  • §6.4/ 2,重点补充:" 转换为令牌的每个预处理令牌都应具有关键字,标识符,常量,字符串文字或标点符号的词法形式." 只要@不"转换为令牌",就不会发生错误.转换为令牌发生在编译过程的第7阶段(参见§5.1.1.2/ 7).在第4阶段扩展宏(包括字符串化)之后很久.

  • "@是一个有效的预处理器令牌" - 这是关键,相关的标准部分似乎是[C11第6.4节](http://port70.net/~nsz/c/c11/n1570.html#6.4),其中`preprocessing-token`的定义包括与其他预处理令牌类别不匹配的任何非空白字符. (4认同)