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之外的一个存储类标识符进行声明,那么从该存储类说明符导出的结果属性,除了关于连接,也应用于该对象的成员,并且也递归地应用于任一聚合或联合体成员对象。