让我们举两个在关键字之间使用“stuff”的例子:
#include
int main(void)
{
printf("OK\n");
pri\
ntf("OK\n"); // version 1
pri/**/ntf("Hi"); // version 2
return 0;
}也就是说,有一个评论
和一个
..。这两个应该如何处理,还是依赖于编译器?
发布于 2021-02-28 12:36:33
从C99
翻译阶段
翻译的语法规则之间的优先级由以下阶段指定。
如果需要,物理源文件多字节字符将以实现定义的方式映射到源字符集(引入换行符作为行尾指示符)。三元图序列被相应的单字符内部表示所取代。
的每个实例
反斜杠字符(
)
紧随其后的换行符被删除,拼接物理源代码行以形成逻辑源代码行
..。只有任何物理源行上的最后一个反斜杠才有资格成为这种拼接的一部分。非空的源文件应以换行符结尾,在任何此类拼接发生之前,换行符的前面不应紧跟反斜杠字符。
源文件被分解为预处理标记和空白字符序列(包括注释)。源文件不应以部分预处理标记或部分注释结束。
每个注释都替换为一个空格字符。
将保留换行符。除换行符之外的每个非空的空格字符序列是保留还是替换为一个空格字符,这是由实现定义的。
..。
pri\
ntf("OK\n"); // version 1有效,因为它解析为
在上面的步骤2之后。
pri/**/ntf("Hi"); // version 2无效,因为它解析为
在上面的步骤3之后。
发布于 2021-02-28 12:41:28
我将代码保存在文件a.cpp中,然后预编译代码:
gcc -E a.cpp输出为:
int main(void)
{
printf("OK\n");
printf("OK\n");
pri ntf("Hi");
return 0;
}第一种情况可以通过编译。但对于第二种情况,gcc将替换
设置为空,则编译将失败。
在这一点上,gcc和clang具有相同的结果。这是一个C标准。
https://stackoverflow.com/questions/66405799
复制相似问题