【问题标题】:implicit int in c languagec语言中的隐式int
【发布时间】:2014-10-04 05:26:06
【问题描述】:

我正在使用 orwell dev c++ IDE。我知道在旧的 C89 标准和准标准 C++ 支持 default to 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 标准仍然允许默认为 int? 我的猜测是,如果它没有,很多旧代码都会中断。
  • 为什么要套用过去的规则?奴隶制,燃烧的女巫……无论如何,C++ 和 C 是两种不同的语言。只是碰巧在他们的名字中有 C 并且有共同的遗产
  • “默认 int 规则是否也适用于变量?”:是的,C90 的允许类型说明符列表(在 6.5.2 中)包含以下条目作为允许的选项之一(强调添加):“int,signed,signed int,或没有类型说明符”。 C99 删除了最后一位。

标签: c variables


【解决方案1】:

这在C99 rationale中有解释:

C99 的一个新特性:

在 C89 中,所有类型说明符都可以从声明中省略 声明中的说明符。在这种情况下, int 是隐含的。这 委员会认为此功能的内在危险超过了 它很方便,所以它被删除了。效果是保证 生产将捕获额外类别的诊断 编程错误。发出诊断后,执行 可以选择假设一个隐式 int 并继续翻译程序以支持利用此功能的现有源代码。

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

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

7.1.5/2

至少需要一个不是 cv-qualifiertype-specifier 在声明中,除非它声明了构造函数、析构函数或 转换函数。80)

80) 没有特别规定 decl-specifier-seq 缺少 type-specifier 或具有仅指定 cv-qualifierstype-specifier时间>。不再支持 C 的“隐式 int”规则。

例如,GCC 支持 ISO/IEC 14882:1998 及更高版本,所以无论如何这都会出错。

【讨论】:

    【解决方案2】:

    C99 标准不允许省略类型。

    第 6.7.2.2 节说:

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

    【讨论】:

      猜你喜欢
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 2017-04-11
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多