
正文
ISO/IEC 9899:2011 条款6.7.1——存储类说明符
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
6.7.1 存储类说明符
语法
1、 storage-class-specifier :
typedef
extern
static
_Thread_local
auto
register
约束
2、在一个声明中,在声明说明符中最多只能给出一个存储类说明符,除了 _Thread_local 可以与 static 或 extern 一起出现。[注:见“未来语言方向”(6.11.5)]
3、在含有语句块作用域的一个对象的声明中,如果声明说明符包含了 _Thread_local ,那么它们应该也包含 static 或是 extern 。如果 _Thread_local 出现在一个对象的任一声明中,那么它应该出现在那个对象的每个声明中。
4、 _Thread_local 不应该出现在一个函数声明的声明说明符中。
语义
5、 typedef 说明符被称为一个“存储类说明符”,只是用于语法上的便利性;它在6.7.8中讨论。各种连接与存储周期的意义在6.2.2与6.2.4中讨论。
6、一个对象的一个标识符带有 register 说明符的声明建议了对该对象的访问越快越好。对此建议有效性的扩展是由实现定义的。[注:实现可以将任一 register 声明简单地看作为 auto 声明。然而,无论实际上是否用了可寻址的存储,具有存储类说明符 register 的一个对象的任一部分的地址不能被计算,不管是显式的(通过使用单目 & 操作符,在6.5.3.2中讨论),还是隐式的(通过将一个数组名转为一个指针(在6.3.2.1中讨论))。从而,唯一能被应用于具有存储类说明符 register 的一个数组声明的操作符是 sizeof 和 _Alignof 。]
7、对一个具有语句块作用域的函数标识符的声明应该不具有显式的存储类说明符,除了 extern 。[ 译者注 :看如下代码:
void fun1(void)
{
} static void fun2(void)
{
} int main(void)
{
extern void fun1(void); // OK static void fun2(void); // ERROR: 在语句块作用域中所声明的函数不能具有static存储类
}
]
8、如果一个聚合或联合体对象用具有除了 typedef 之外的一个存储类标识符进行声明,那么从该存储类说明符导出的结果属性,除了关于连接,也应用于该对象的成员,并且也递归地应用于任一聚合或联合体成员对象。







