我正在使用orwell dev c ++ IDE.我知道在旧的C89
标准和预标准中,当函数定义中没有明确指定函数的返回类型时,C++支持缺省为int规则.但它已在C++中被禁止.但最近我写了以下简单的C程序,它工作正常.
#include <stdio.h>
void fun();
int main(void)
{
int a=9;
printf("%d",a);
printf("%d",a);
fun();
return 0;
}
a=1;
void fun()
{
printf("%d",a);
}
Run Code Online (Sandbox Code Playgroud)
默认的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]
Run Code Online (Sandbox Code Playgroud)
为什么C99
标准仍允许默认为int?它在C++中编译失败.如果我错了,请纠正我?此C程序也适用于ideone.com等在线编译器
小智 8
这在C99理由中解释:
C99的新功能:
在C89中,声明中的声明说明符可以省略所有类型说明符.在这种情况下,暗示了int.委员会认为,这一特征的内在危险性超过了它的便利性,因此被删除了.其结果是保证生成可以捕获其他类别编程错误的诊断.在发出诊断之后,实现可以选择假设隐式int并继续转换程序以支持利用此功能的现有源代码.
换句话说,它正式从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及更高版本,因此无论如何都是错误的.