C Primer Plus 第12章 12.2 存储类说明符

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
相关文章
相关标签/搜索