是汽车;一个有效的C翻译单位?

时间:2014-11-09 01:53:00

标签: c gcc clang

创建一个文件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标准?允许自动声明什么都没有声明的重点是什么?

1 个答案:

答案 0 :(得分:4)

这不是有效的代码。但是,在发出诊断消息后,实现可以自由地给它任何意义。

  

5.1.1.3诊断

     

1符合要求的实施应至少产生一条诊断信息(在   如果是预处理翻译单元或翻译单元,则是实现定义的方式   包含违反任何语法规则或约束的行为,即使行为也是明确的   指定为未定义或实现定义。诊断消息不一定是   在其他情况下产生.9)
  [...]

  

6.7声明

     

<强>约束
  2除static_assert声明以外的声明应至少声明声明者   (除了函数的参数或结构或联合的成员),标签或   枚举的成员。
  [...]

C99 +修正案的引言(C11,n1570)