在阅读ANSI C Yacc grammar规范后,我注意到以下内容都是有效的:
register x;
auto y;
static z;
extern q;
这对我来说似乎很奇怪,因为我对类型的理解会暗示这些变量都没有类型。这些是什么意思?他们如何打字?分配了多少内存?
答案 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 version的C11与类型说明符的区别不大在声明中。因此,这种情况下的语法不足以强制执行此约束。您必须转到标准部分6.7.2
类型说明符并看到它说:
每个声明中的声明说明符中应至少提供一个类型说明符,并在每个结构声明和类型名称的说明符限定符列表中给出。