C语言中有5个关于存储类说明符的关键字,它们是auto、register、static、extern以及typedef。关键字typedef与内存存储无关,因为语法缘由被纳入此类。特别地,不能够在一个声明中使用一个以上存储类说明符,这意味着不能将其余任一存储类说明符做为typedef的一部分。小程序
说明符auto代表一个变量具备自动存储时期。该说明符只能用在具备代码块做用域的变量声明中,而这样的变量已经拥有自动存储时期,所以它主要用来明确指出意图,使程序更易读。函数
说明符register也只能用于具备代码块做用域的变量。它将一个变量纳入寄存器存储类,这至关于请求将该 变量存储在一个寄存器内,以更快地存取。它的使用也使您不能得到变量的地址。oop
说明符static在用于具备代码块做用域的变量的声明时,使该变量具备静态存储时期,从而得以在程序运行期间(即便在包含该变量的代码块并无运行时)存在并保留其值。变量仍具备代码块做用域和空连接。static在用于具备文件做用域的变量的声明时,代表该变量具备内部连接。ui
说明符extern代表您在声明一个已经在别处定义了的变量。若是包含extern的声明具备文件做用域,所指向的变量必然具备外部连接。若是包含extern的声明具备代码块做用域,所指向的变量可能具备外部连接也可能具备内部连接,这取决于该变量的定义声明。设计
下面给出了一个使用所有5种存储类的小程序。它由两个文件组成,所以您须要多文件编译。程序的主要目的是使用所有5种存储类,并不是提供一个设计范例;更好的设计将不须要文件做用域变量。code
程序清单12.5 parta.c文件内存
//parta.c --各类存储类 #include <stdio.h> void report_count(); void accumulate(int k); int count = 0; //文件做用域,外部连接 int main(void) { int value; //自动变量 register int i; //寄存器变量 printf("Enter a positive integer(0 to quit): "); while(scanf("%d",&value) == 1 && value > 0) { ++count; //使用文件做用域变量 for (i=value;i>=0;i--) accumulate(i); printf("Enter a positive integer(0 to quit): "); } report_count(); return 0; } void report_count() { printf("Loop executed %d times\n",count); }
程序清单12.6 partb.c 文件作用域
#include <stdio.h> extern int count; //引用声明,外部连接 static int total = 0; //静态定义,内部连接 void accumulate(int k) //原型 void accumulate(int k) //k具备代码块做用域,空连接 { static int subtotal = 0; //静态,空连接 if(k<=0) { printf("loop cycle: %d\n",count); printf("subtotal: %d;total: %d\n",subtotal,total); subtotal = 0; } else { subtotal += k; total += k; } }
在该程序中,具备代码块做用域的静态变量subtotal保存运行时传递给函数accumulate()的数值的部分和具备文件做用域、内部连接的变量total保存运行时的总和。一量有非正数传入,函数accumulate()就报告total和subtotal的值;并在报告时将subtotal重置为0。parta.c中的函数accumulate()函数原型是必须的,由于函数包含一个accumulate()函数调用。对于partb.c来讲,函数原型是可选的,由于这个函数虽然定义了,可是并无在该文件中被调用。函数同时使用外部变量count来记录main()中的while循环执行了多少次(顺便提一下,这是一个什么状况下不该使用外部变量的反而例子,由于它使parta.c和partb.c的代码没必要要地纠缠在了一块儿)。在parta.c中,main()和report_count()共享count。原型
下面是一个运行示例:it
Enter a positive integer (0 to quit): 5 loop cycle: 1 subtotal: 15; total: 15 Enter a positive integer (0 to quit): 10 loop cycle: 2 subtotal: 55; total: 70 Enter a positive integer (0 to quit): 2 loop cycle: 3 subtotal: 3; total: 73 Enter a positive integer (0 to quit): 0 loop executed 3 times