创建一个test.c
包含以下代码的文件:
auto;
Run Code Online (Sandbox Code Playgroud)
用clang 6.0编译它:clang -c test.c
.它将成功生成一个目标文件test.o
,虽然没有实际内容(目标文件头除外).它会打印一个警告,但仍接受此作为有效代码:
test.c:1:1: warning: declaration does not declare anything [-Wmissing-declarations]
auto;
^~~~
1 warning generated.
Run Code Online (Sandbox Code Playgroud)
相比之下,gcc 4.9拒绝编译test.c
,生成错误:
test.c:1:1: error: 'auto' in file-scope empty declaration
auto;
^
Run Code Online (Sandbox Code Playgroud)
为什么clang生成警告但是接受这个翻译单元是有效的,而gcc生成错误并拒绝编译它?谁的行为更符合C标准?允许自动声明什么都没有声明的重点是什么?
这不是有效的代码。但在发出诊断消息后,实现可以自由地赋予它任何它想要的含义。
5.1.1.3 诊断
1 如果预处理翻译单元或翻译单元包含违反任何语法规则或约束,即使该行为也被显式指定为未定义或实现,一致的实现应产生至少一条诊断消息(以实现定义的方式标识) -定义。在其他情况下不需要生成诊断消息。9)
[...]
6.7 声明
约束
2 声明以外的声明static_assert
至少应声明一个声明符(函数的参数或结构或联合的成员除外)、标签或枚举的成员。
[...]
引自 C99+修正案 (C11, n1570)