[英]What does it mean to declare a variable with a storage class specifier but no type specifier?
在阅读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
但不是在这种情况下。
如果我们看一下C99标准草案的前部说:
[...]上一版的主要变化包括:
并包括以下项目:
- 删除隐式int
更新
从国际标准程序设计语言的基本原理-C部分6.7.2
类型说明符 :
C99的新特性:在C89中,声明中的声明说明符可以省略所有类型说明符。 在这种情况下,暗示了int。 委员会认为,这一特征的固有危险性超过了它的便利性,因此被删除了。 其结果是保证生成可以捕获其他类别编程错误的诊断。 在发出诊断之后,实现可以选择假设隐式int并继续转换程序以支持利用此功能的现有源代码。
您使用的语法确实早于C99,但据我所知, 更新的新版本反映C11与声明中的类型说明符没有太大差别。 因此,这种情况下的语法不足以强制执行此约束。 您必须转到标准部分6.7.2
类型说明符,并看到它说:
每个声明中的声明说明符中应至少给出一个类型说明符,并在每个结构声明和类型名称的说明符限定符列表中给出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.