在C程序存储类定义范围(可见度)和变量和/或函数生命周期内。这些修饰符先于它们修改类型。有下列存储类,它可以在C程序中使用:
-
auto
-
register
-
static
-
extern
自动存储类
自动(auto)存储类是所有局部变量的默认的存储类别。
{ int mount; auto int month; }
上面的例子中定义了两个变量具有相同的存储类,auto只能在函数中使用,也就是说,局部变量。
寄存器存储类
寄存器存储用于定义应当被存储在寄存器中,而不是RAM中的局部变量。这意味着该变量等于寄存器大小(通常为一个字)的最大容量,并且可以不具有适用于它的一元'&'操作(因为它不具有一个存储器位置)。
{ register int miles; }
寄存器应只用于需要快速访问诸如计数器变量。还应当指出的是界定“register”并不意味着该变量将被存储在一个寄存器中。这意味着,它可能被存储在寄存器依赖于硬件和执行的限制。
静态存储类
静态存储类指示编译器在程序而不是创建在每次进入和超出范围时销毁它的生命周期内,以保持局部变量存在。因此,使得局部变量静态使它们能够保持函数调用之间的值。
静态修辞符也可以应用于全局变量。当这样做时,它会导致该变量的范围被限制在其所声明的文件。
在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 ", i, count); }
在这个时候可能不理解这个例子,因为我们已经使用函数和全局变量,这些到目前为止都未作介绍。所以现在继续,即使不完全明白它。让我们编译并运行上面的程序,这将产生以下结果:
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
extern存储类
extern存储类是用来给是可见的所有程序文件的全局变量的引用。当使用“extern”,变量不能被初始化为它先前已定义的存储位置指向变量名。
当有多个文件,并可以定义一个全局变量或功能,这将在其他文件中也可以使用,extern将被用于在另一个文件中,得到定义的变量或函数的参考。理解 extern 是用于声明在另一个文件中的全局变量或函数。
extern修饰符是最常用的,当存在两个或多个文件,如下所述共用同一全局变量或函数。
第一个文件: main.c
#include <stdio.h> int count ; extern void write_extern(); main() { count = 5; write_extern(); }
第二个文件: support.c
#include <stdio.h> extern int count; void write_extern(void) { printf("count is %d ", count); }
这里,extern关键字被用于在第二文件中声明的计数,其中,因为它有其在所述第一文件,在main.c中定义。现在,如下编译这两个文件:
$gcc main.c support.c
这将产生 a.out 可执行程序,当执行该程序时,它产生了以下结果:
5