Cprogramming 简明教程
Storage Classes in C
我们在 C 程序中有四个不同的存储类 −
-
auto
-
register
-
static
-
extern
The auto Storage Class
auto 是在函数或块中声明的所有变量的默认存储类。可以将关键字“ auto ”(这是可选的)用于定义局部变量。
auto 变量的范围和生存期在其声明的同一个块中。
The register Storage Class
register 存储类用来定义应存储在寄存器中而不是 RAM 中的局部变量。这意味着该变量的最大大小等于寄存器大小(通常一个字),并且不能应用一元运算符 “&”(因为它没有存储空间)。
此寄存器应仅用于需要快速访问的变量,如计数器。还应注意,定义“寄存器”并不意味着变量将存储在寄存器中。这意味着,根据硬件和实现限制,它可能被存储在寄存器中。
The static Storage Class
static 存储类指示 compiler 在程序生命周期中保留局部变量,而不是每次进入和退出作用域时都创建和销毁局部变量。因此,使局部变量成为静态变量允许它们在函数调用之间保持其值。
static 修饰符还可以应用于 global variables 。执行此操作会使该变量的范围限制为在其声明的文件中。
在 C 编程中,当 static 用于全局变量时,它会只让类的所有对象共享该成员的一个副本。
Example of static Storage Class
以下示例演示了在 C 程序中使用静态存储类的情况 −
#include <stdio.h>
/* function declaration */
void func(void);
static int count = 5; /* global variable */
main(){
while(count--) {
func();
}
return 0;
}
/* function definition */
void func(void) {
static int i = 5; /* local static variable */
i++;
printf("i is %d and count is %d\n", i, count);
}
Output
编译并执行上述代码后,将产生以下结果 −
i is 6 and count is 4
i is 7 and count is 3
i is 8 and count is 2
i is 9 and count is 1
i is 10 and count is 0
The extern Storage Class
extern 存储类用于给出全局变量的一个引用,所有程序文件都可以看到。当你使用 'extern' 时,该变量不能被初始化,然而它将变量名指向一个之前定义的存储位置。
当你有多个文件,并且你定义了一个全局变量或函数,并且其他文件也将使用它时,那么 extern 将用于另一个文件,以提供已定义变量或函数的引用。仅仅为了理解,extern 用于在另一个文件中声明一个全局变量或函数。
最通常在两个或更多文件共享相同全局变量或函数时使用 extern 修饰符,如下文所述。
Example of extern Storage Class
外存储类的示例可能包含两个或更多文件。以下示例演示了在 C 语言中使用 extern 存储类的情况 −
First File: main.c
#include <stdio.h>
int count;
extern void write_extern();
main(){
count = 5;
write_extern();
}
Second File: support.c
#include <stdio.h>
extern int count;
void write_extern(void) {
printf("Count is %d\n", count);
}
在此处, extern 用于在第二个文件中声明 count ,而其定义在第一个文件中 (main.c)。现在,按如下方式编译这两个文件 −
$gcc main.c support.c
它将生成可执行程序 a.out 。当执行此程序时,它将产生以下输出 −
Count is 5
Summary of Storage Classes
下表总结了具有不同存储类的变量的作用域、默认值和生命周期 −
Storage Class |
Name |
Memory |
Scope, Default Value |
Lifetime |
auto |
Automatic |
Internal Memory |
Local Scope, Garbage Value |
在声明它们的函数或块内。 |
register |
Register |
Register |
Local Scope, 0 |
在声明它们的函数或块内。 |
static |
Static |
Internal Memory |
Local Scope, 0 |
在程序中,即只要程序还在运行。 |
extern |
External |
Internal Memory |
Global Scope, 0 |
在程序中,即只要程序还在运行。 |