C存储类
存储类定义C程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出C程序中可用的存储类:
auto
register
static
extern
auto存储类
auto存储类是所有局部变量默认的存储类。
{ int mount; auto int month; }
上面的实例定义了两个带相同存储类的变量,auto只能用在函数内,即auto只能修饰局部变量。
register存储类
register存储类用于定义存储在寄存器中而不是RAM中的局部变量。这意味着变量的自大尺寸等于寄存器的大小(通常是一个词),且不能对它应用一元的‘&’运算符(因为它们没有内存位置)。
{ register int miles; }
static存储类
static存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。一次,使用static修饰局部变量可以在函数调用之间保持局部变量的值。
static修饰符也可以应用与全局变量。当static修饰全局变量时,会使变量的作用域限制在声明它的文件内。
全局声明的一个static变量或方法可以被人和函数或方法调用,只要这些方法出现在跟static变量或方法同一个文件中。
#include <stdio.h> /*函数声明*/ void func1(void); /*全局变量 - static时默认的 */ int main() { while (count --){ func1(); } return 0; } void func1(void) { /* 'thingy' 时 ‘func1’的局部变量 - 只初始化一次 * 每次调用函数 ‘func1’ 'thingy' 只不会被重置。 */ static int thingy = 5; thingy++; printf("thingy 为%d, count 为 %d\n",thingy,count); }
extern存储类
extern存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当使用extern时,对于无法初始话的变量,会发变量指向一个之前定义过的存储位置。
mutable存储类
mutable说明符仅适用与类的对象,这将在本教程的最后进行讲解。
可以通过const成员函数修改。
thread_local存储类
使用thread_local说明符声明的变量仅可在他在其上创建的线程上放问。变量在创建线程适创建,并在销毁线程适销毁。每个线程都有其自己的变量副本。
thread_local说明符可以与static或extern合并。
可以将thread_local仅引用与数据声明和定义,thread_local不能用与函数声明或定义。
thread_local int x; //命名空间下的全局变量 class X { static thread_local std::string s; //类的static成员变量 }; static thread_local std::string X::s; //X::s适需要定义的 void foo() { thread_local std::vector<int> v; //本地变量 }