用存储类说明符声明变量但没有类型说明符是什么意思?

时间:2014-01-26 03:19:34

标签: c gcc types standards storage-class-specifier

在阅读ANSI C Yacc grammar规范后,我注意到以下内容都是有效的:

register x;
auto y;
static z;
extern q;

这对我来说似乎很奇怪,因为我对类型的理解会暗示这些变量都没有类型。这些是什么意思?他们如何打字?分配了多少内存?

1 个答案:

答案 0 :(得分:10)

在C99之前,如果未指定类型,则默认为int这应该在C99中被删除,但许多编译器甚至在C99模式下也支持它。例如在clang甚至使用-std=c99我只收到以下警告而不是错误:

warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
  register x;
  ~~~~~~~~ ^
warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
  auto y;
  ~~~~ ^
warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
  static z;
  ~~~~~~ ^
warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
  extern q;
  ~~~~~~ ^

gcc在这种情况下也只提供警告,但使用-pedantic-errors标记会导致gcc产生错误,gcc中的扩展通常会出现错误通常是clang但不是在这种情况下。

如果我们查看draft C99 standard 转发部分说明:

  

[...]上一版的主要变化包括:

并包含以下项目符号:

  

- 删除隐式int

更新

来自Rationale for International Standard—Programming Languages—C部分6.7.2 类型说明符

  

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

你使用的语法确实早于 C99 ,但据我所知,更新后反映newer versionC11与类型说明符的区别不大在声明中。因此,这种情况下的语法不足以强制执行此约束。您必须转到标准部分6.7.2 类型说明符并看到它说:

  

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