通过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列表中的列表和类型名称。