存储类包括以下内容:
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 */
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/266730.html