在阅读了ANSI C Yacc 语法规范后,我注意到以下内容都是有效的:
register x;
auto y;
static z;
extern q;
这对我来说似乎很奇怪,因为我对类型的理解表明这些变量都没有类型。这些是什么意思?它们是如何进行类型检查的?分配了多少内存?
在阅读了ANSI C Yacc 语法规范后,我注意到以下内容都是有效的:
register x;
auto y;
static z;
extern q;
这对我来说似乎很奇怪,因为我对类型的理解表明这些变量都没有类型。这些是什么意思?它们是如何进行类型检查的?分配了多少内存?
在 C99 之前,如果未指定类型,则默认为int
this 应该在 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 但在这种情况下不会。
如果我们看一下C99 标准草案,前进部分会说:
[...]与上一版本相比的主要变化包括:
并包括以下项目符号:
— 删除隐式 int
更新
来自国际标准的基本原理-编程语言-C部分6.7.2
类型说明符:
C99 的新特性:在 C89 中,可以从声明中的声明说明符中省略所有类型说明符。在这种情况下, int 是隐含的。委员会认为此功能的固有危险大于其便利性,因此将其删除。其效果是保证生成将捕获额外类别的编程错误的诊断。发出诊断后,实现可以选择采用隐式 int 并继续翻译程序以支持利用此功能的现有源代码。
您使用的语法确实早于C99,但据我所知,更新以反映C11的较新版本在声明中的类型说明符方面没有太大差异。所以这种情况下的语法不足以强制执行这个约束。您必须转到标准部分Type specifiers并看到它说:6.7.2
在每个声明的声明说明符中,以及每个结构声明和类型名称的说明符限定符列表中,至少应给出一个类型说明符。