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节说:
每个声明中的声明说明符中应至少给出一个类型说明符,并在每个结构声明和类型名称的说明符限定符列表中给出。