存储类包括以下内容:

  • auto
  • register
  • extern
  • static

它们决定了变量范围和寿命。

1. auto

局部变量的默认存储类是auto。可以使用auto关键字明确指定。输入代码块时会分配自动变量的内存,退出时会释放。auto变量的范围是声明它们的块的本地范围。

int main(void) {
   auto  localVar = 0; /* auto variable */
}

2. register

register存储类告诉编译器将变量放在CPU寄存器而不是RAM存储器中以提供更好的性能。register存储类的变量不能使用address-of运算符,因为寄存器没有存储器地址。

int main(void) {
  register int counter; /* register variable */
}

register关键字的使用已被弃用。

3. external

external存储类引用另一个编译单元中定义的变量或函数。编译单元包括源文件和头文件。
函数默认为外部存储类。

/* app.c */
extern void foo(void); /* declared function */
int main(void) {
  foo(); /* external function call */
}

/* func.c */
void foo(void) {} /* defined function */

当带有全局变量的extern告诉编译器该变量是在其他地方定义的。

/* app.c */
int globalVar; /* defined variable */

int main(void) {
  globalVar = 1;
}

/* func.c */
extern int globalVar; /* declared variable */

int foo(void) {
  globalVar++;
}

4. static

静态(static)存储类将全局变量或函数的范围限制在定义它的编译单元。

/* Only visible within this compilation unit */
static int myInt;
static void myFunc(void) {}

局部变量可以声明为静态,以使函数在程序的持续时间内保留变量。静态局部变量仅初始化一次。

/* Store number of calls to this function */
void myFunc(void) {
  static int count = 0;
  count++;
}

5. volatile

volatile修饰符告诉编译器外部可以更改变量的值。

volatile int var; /* recommended order */
int volatile var; /* alternative order */