use*_*840 6 c standards gcc clang backslash
编译以下代码段时,gcc和clang都只发出警告.注意\下一个后面的空格int:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int \
a = 10;
printf("%d\n", a);
}
Run Code Online (Sandbox Code Playgroud)
GCC:
main.c:7:6:警告:反斜杠和换行符以空格分隔[默认启用]
铛:
main.c:7:7:警告:反斜杠和换行符以空格分隔int ^
在5.1.1.2的c99标准中,它说:
删除反斜杠字符()后面紧跟一个新行字符的每个实例,拼接物理源代码行以形成逻辑源代码行.
为什么C编译器不符合C标准?我认为只有他们的创作者决定不这样做.我在gcc邮件列表上发现了一条消息,我认为这引起了这种行为:http://gcc.gnu.org/ml/gcc-patches/2000-09/msg00430.html.在那里,他们说这是完成的,因为尾随空格是常见的,他们不想将它们视为错误.这有多常见?
只要在文档中进行了更改,gcc文档中第6.21节“转义换行符的轻微松散规则”中所做的更改,便允许编译器扩展语言。
最近,预处理器已经放松了对转义换行符的处理。以前,换行符必须立即加上反斜杠。当前实现允许以空格,水平和垂直制表符的形式出现空格,并在反斜杠和后续换行符之间形成换页。预处理器发出警告,但将其视为有效的转义换行符,并将这两行合并以形成一条逻辑行。这适用于注释和标记以及标记之间。出于放松目的,注释不被视为空白,因为它们尚未被空格代替。
并clang 努力支持 gcc扩展并指向扩展gcc文档:
本文档介绍了Clang提供的语言扩展。除了此处列出的语言扩展之外,Clang还旨在支持各种GCC扩展。有关这些扩展的更多信息,请参见GCC手册。
因此,他们履行了有关标准的义务。实际上,Linux依赖于许多gcc扩展。通过查看C99标准草案“ 4. 符合性”第6段,可以看到这一点:
符合标准的实现可以扩展(包括其他库函数),只要它们不会改变任何严格符合标准的程序的行为即可。3)
脚注3说:
这意味着除本国际标准中明确保留的标识符外,符合标准的实现不保留任何标识符。
和第8段:
一个实现应随附一个文档,该文档定义所有定义的实现和特定于语言环境的特征以及所有扩展。
gcc也文件,你可以使用-pedantic标志使用扩展时生成一个警告,您可以使用-pedantic-errors标志,使它的错误:
要获得标准要求的所有诊断,还应指定-pedantic(如果希望它们是错误而不是警告,则应指定-pedantic-errors)。