[英]implicit int in c language
我正在使用 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);
}
默认 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的一个新特性:
在 C89 中,可以从声明中的声明说明符中省略所有类型说明符。 在这种情况下,int 是隐含的。 委员会认为此功能的固有危险大于其便利性,因此将其删除。 其效果是保证诊断的产生,该诊断将捕获额外类别的编程错误。 发出诊断后,实现可以选择假定隐式 int 并继续翻译程序,以支持利用此功能的现有源代码。
换句话说,它已正式从 C99 标准中删除,但编译器可能仍会选择遵循此行为并发出诊断信息,就像 GCC 所做的那样。 例如,查看-Wimplicit-int
的警告选项页面。 要将这些警告编译为错误,请使用-pedantic-errors
或-Werror
。
根据@Anonymous 的回答, c++98包含有关类型说明符的类似规则。
7.1.5/2
声明中至少需要一个不是cv 限定符的类型说明符,除非它声明了构造函数、析构函数或转换函数。 80)
80)对于缺少类型说明符或具有仅指定cv-qualifiers的类型说明符的decl-specifier-seq没有特殊规定。 不再支持 C 的“隐式 int”规则。
例如, GCC支持 ISO/IEC 14882:1998 及更高版本,因此无论如何这都会是一个错误。
C99 标准不允许省略类型。
第 6.7.2.2 节说:
每个声明的声明说明符中以及每个结构声明和类型名称的说明符-限定符列表中应至少给出一个类型说明符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.