创建一个文件test.c
,其中包含以下代码:
auto;
使用clang 6.0编译:{{1}}。它将成功生成一个目标文件clang -c test.c
,尽管它没有实际内容(除了目标文件头)。它会打印一个警告,但仍接受此作为有效代码:
test.o
相比之下,gcc 4.9拒绝编译test.c:1:1: warning: declaration does not declare anything [-Wmissing-declarations]
auto;
^~~~
1 warning generated.
,产生错误:
test.c
为什么clang会生成警告但是接受此翻译单元为有效,而gcc会生成错误并拒绝编译它?谁的行为更符合C标准?允许自动声明什么都没有声明的重点是什么?
答案 0 :(得分:4)
这不是有效的代码。但是,在发出诊断消息后,实现可以自由地给它任何意义。
5.1.1.3诊断
1符合要求的实施应至少产生一条诊断信息(在 如果是预处理翻译单元或翻译单元,则是实现定义的方式 包含违反任何语法规则或约束的行为,即使行为也是明确的 指定为未定义或实现定义。诊断消息不一定是 在其他情况下产生.9)
[...]
6.7声明
<强>约束强>
2除static_assert
声明以外的声明应至少声明声明者 (除了函数的参数或结构或联合的成员),标签或 枚举的成员。
[...]
C99 +修正案的引言(C11,n1570)