N2310/5.1.1.2(p1)
定义翻译阶段。特别是阶段2:
- 删除每个紧跟一个换行符的反斜杠字符(
\
)的每个实例,将物理源代码行拼接到 形成逻辑源代码行。任何物理上只有最后一个反斜杠 源代码行有资格成为此类接头的一部分。一种 不为空的源文件应以换行符结尾, 不得在任何字符前紧跟反斜杠字符 这样的拼接就发生了。
考虑以下代码:
#include <stdio.h>
int main(void){
//There are spaces after the backslash before the new-line
int i = 12\
34;
printf("%d\n", i); //prints 1234
}
在我的计算机上,它使用gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
进行编译,
warning: backslash and newline separated by space
int i = 12\
但是仍然打印1234
。
在没有gcc
标志的情况下,这是clang
/ -Werror
的非标准化扩展且完全符合要求的编译器是否应打印错误?
答案 0 :(得分:4)
该标准不区分警告和错误,仅使用一个术语“诊断消息”。合格的编译器在遇到无效程序时必须发出诊断消息。但是,此时无需终止编译。 C11(N1570)5.1.1.3明确指出:
符合的实现应产生至少一个诊断消息(在 一种实现定义的方式)(如果是预处理翻译单元或翻译单元) 包含违反任何语法规则或约束的行为,即使该行为也是显式的 指定为未定义或实现定义。诊断消息不必是 在其他情况下产生的。 9)
9)目的是,实现应确定每个对象的性质,并在可能的情况下进行本地化 违反。当然,实施可以免费产生任意数量的诊断信息,只要 有效程序仍正确翻译。它还可以成功翻译无效程序。
(强调我的)
这意味着gcc在发出警告并随后以其认为合适的任何方式翻译代码时完全符合要求。这实际上只是一个可用性功能。