从头学C(37)静态变量

0

为了达到隐藏实现细节de 目的,有一些变量我们希望仅供某些函数使用,而不提供给其他函数使用。

比如在之前计算机程序中,pop_push.c 中的变量 sp 和 val,getch_ungetch.c 中的变量 buf 和 bufp,它们仅供其所在的源文件中的函数使用,而不允许其他函数访问。这里是利用了变量的作用域规则,达到了我们的目的。

通过 static 关键字声明外部变量与函数,可以将其后声明的对象的作用域强制限定为被编译源文件的剩余部分。这就是我们本节要看到的静态变量。

第四章 函数与程序结构 >> 4.6 静态变量

要将对象指定为静态变量,可以在正常的对象声明之前额外加上关键字 static 作为前缀。

1. static声明外部变量

基于之前的getch_ungetch.c,我们修改如下所示:

static char buf[BUFSIZE];     /* buffer for ungetch */
static int bufp = 0;          /* next free position in buf */

int getch(void) { ... }
void ungetch(int) { ... }

那么其他 getch_ungetch.c 以外的函数就不能访问 buf 和 bufp 这两个函数了。这样即使同一程序中的其他源文件中定义了同名的变量,也不会引起冲突,因为用 static 修饰的变量和其他文件中的同名变量已经不是同一个变量了。

同样 pop_push.c 中的外部变量 sp 和 val,也可以用 static 来修饰,因为它们也是栈操作的专用数据,不需要开放给其他函数。

2. static声明函数

static 也可以用来声明函数。通常情况下,函数名字是可以全局访问的,对整个程序的各个部分而言都是可见的。

而如果把函数声明为 static 类型,则该函数仅对该函数声明所在的源文件可见,其他文件的函数无法调用该函数。

3. static声明局部变量

当一个函数内的局部变量用 static 声明时,并不能改变该变量的作用域(仍然是只能在该函数内部使用,其他函数无法访问),但与局部变量不同之处在于:局部变量在函数调用结束后就消失了,但静态局部变量则一直存在,即本次函数调用结束后,变量依然存在,下次再调用本函数时,其变量的值依然有效。

换句话说,static 类型的局部变量是一种只能在其声明所在函数中使用,但一直占据存储空间的变量。

Leave A Reply