C-用存储类规范术语而没有类型规范的变量是什么意思



通过ANSI C YACC语法规范阅读后,我注意到以下所有内容都是有效的:

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

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

在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中to to,但在这种情况下不得。

> 。

如果我们查看C99标准草案 forward e节说:

[...]上一个版本的重大更改包括:

并包括以下子弹:

- 删除隐式int

更新

来自国际标准的基本原理 - 编程语言 - c节6.7.2 类型说明器

C99的新功能:在C89中,可以从声明中省略所有类型的指定符 声明中的指定器。在这种情况下,暗示了int。委员会决定 此功能的固有危险大于其便利性,因此已将其删除。效果是确保生产诊断,该诊断将捕获其他类别的编程错误。发出诊断后,实现可以选择假设一个隐式INT并继续翻译程序以支持利用此功能的现有源代码。

您正在使用的语法确实 c99 ,但据我所知,对反映C11进行更新的较新版本在声明中的类型规范方面没有太大差异。因此,在这种情况下的语法不足以执行此约束。您必须获得标准部分6.7.2 type specifiers ,然后看到它说:

在每个声明中的声明说明符中至少应给出一个类型的指定词,在每个struct-qualifier列表中,每个struct-qualifier列表中的列表和类型名称。

相关内容

  • 没有找到相关文章

最新更新