c语言中的隐式int

我正在使用orwell dev c ++ IDE。 我知道在旧的C89标准和预标准C ++中当函数定义中没有明确指定函数的返回类型时,它支持默认的int规则。 但它已在C ++中被禁止。 但最近我写了以下简单的C程序,它工作正常。

 #include  void fun(); int main(void) { int a=9; printf("%d",a); printf("%d",a); fun(); return 0; } a=1; void fun() { printf("%d",a); } 

默认的int规则是否也适用于变量? 我的编译器向我显示以下警告。

 [Warning] data definition has no type or storage class [enabled by default] [Warning] type defaults to 'int' in declaration of 'a' [enabled by default] 

为什么C99标准仍然允许默认为int? 它在C ++中编译失败。 如果我错了,请纠正我? 此C程序也适用于ideone.com等在线编译器

这在C99理由中解释:

C99的新function:

在C89中,声明中的声明说明符可以省略所有类型说明符。 在这种情况下,暗示了int。 委员会认为,这一特征的内在危险性超过了它的便利性,因此被删除了。 其结果是保证生成可以捕获其他类别编程错误的诊断。 在发出诊断之后,实现可以选择假设隐式int并继续转换程序以支持利用此function的现有源代码。

换句话说,它正式从C99标准中删除,但编译器仍然可以选择遵循此行为并发出诊断,就像GCC那样。 例如,查看-Wimplicit-int的警告选项页面。 要将这些警告编译为错误,请使用-pedantic-errors-Werror

根据@ Anonymous的回答, c ++ 98包含一个关于类型说明符的类似规则。

7.1.5 / 2

除非声明构造函数,析构函数或转换函数,否则声明中至少需要一个不是cv-qualifier的 类型说明符80)

80)对于缺少类型说明符或具有仅指定cv限定符类型说明符decl-specifier-seq ,没有特殊规定。 不再支持C的“隐式int”规则。

例如, GCC支持ISO / IEC 14882:1998及更高版本,因此无论如何都是错误的。

C99标准不允许省略类型。

第6.7.2.2节说:

每个声明中的声明说明符中应至少给出一个类型说明符,并在每个结构声明和类型名称的说明符限定符列表中给出。