4

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

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

这对我来说似乎很奇怪,因为我对类型的理解表明这些变量都没有类型。这些是什么意思?它们是如何进行类型检查的?分配了多少内存?

4

1 回答 1

10

在 C99 之前,如果未指定类型,则默认为intthis 应该在 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,通常是clangto 但在这种情况下不会。

如果我们看一下C99 标准草案前进部分会说:

[...]与上一版本相比的主要变化包括:

并包括以下项目符号:

— 删除隐式 int

更新

来自国际标准的基本原理-编程语言-C部分6.7.2 类型说明符

C99 的新特性:在 C89 中,可以从声明中的声明说明符中省略所有类型说明符。在这种情况下, int 是隐含的。委员会认为此功能的固有危险大于其便利性,因此将其删除。其效果是保证生成将捕获额外类别的编程错误的诊断。发出诊断后,实现可以选择采用隐式 int 并继续翻译程序以支持利用此功能的现有源代码。

您使用的语法确实早于C99,但据我所知,更新以反映C11的较新版本在声明中的类型说明符方面没有太大差异。所以这种情况下的语法不足以强制执行这个约束。您必须转到标准部分Type specifiers并看到它说:6.7.2

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

于 2014-01-26T03:23:56.747 回答