Scope Rules in C
上一篇文章讲了C语言中external variable和function,
这篇文章讲一下C语言中的Scope Rules。
一个变量名或者函数名scope是指它可以被使用的那部分程序空间[1]。
对于一个定义于函数开头的internal variable来说,它的scope就是它所在的函数。
不同函数间的命名相同的internal variable之间没有关联;
不同函数间命名相同的parameter之前没有关联,因为在一个函数中,
它的parameter等同于一个internal variable。如:
void func1(int b)
{
int a = 1;
return a + b;
}
void func2(int b)
{
int a = 100; /* unrelated with a defined in func1() */
return a - b; /* unrelated with b which is parameter of func1() */
}
对于external variable或function而言,它的scope是从它声明(declaration)的那一行起,
到所在文件的末尾[2]。如:
main() { ... }
/* define external variable sp and val */
int sp = 0;
double val[MAXVAL];
void push(double f) { ... }
double pop(void) { ... }
作为external variable,sp和val可以用于函数push和pop,但是不可以用于函数main。
同样的,函数push和pop也不可以用于main。
如果想在一个external variable的定义(definition)之前使用它,或者想在一个文件中使用
定义在另一个文件中的external variable,则需要对这个external variable进行强制的
extern声明。
因此,如果想要在main中使用sp和val,我们只需要在main前面加上它们两个的extern
声明即可,就像这样:
/* declaration external variable sp and val */
extern int sp;
extern double val[];
main() { ... }
/* define external variable sp and val */
int sp = 0;
double val[MAXVAL];
void push(double f) { ... }
double pop(void) { ... }
我们有必要在这里说明一下,一个external variable的声明(declaration)和
定义(definition)的区别。
声明宣告了变量的属性,主要是这个变量的类型;而定义不仅 宣告了变量的属性,同时还为它分配了存储空间。比如:
int sp = 0;
double val[MAXVAL];
这段代码定义了external variablesp和val,为它们分配了存储空间,并且作为声明宣告了它们
的scope为这一行到文件末尾。
而:
extern int sp;
extern double val[];
声明了sp是一个int类型变量,val是一个double类型的数组,数组的大小则由变量定义
的地方决定。但是这段代码并不创建它们也不为它们分配空间。
此外,在一个程序的源代码中,只能有一个external variable的定义,其他文件可以通过
extern声明来对它进行访问。对于数组变量,数组大小必须在其定义的时候进行说明,声明
的时候说或不说(像上面的val[ ])都可以。
external variable的初始化只能在定义的时候进行。
以上。
[1] 来自K&R的《The C Programming Language》,原句为“The scope of a name is the part of the program within which the name can be used.”
[2] 来自K&R的《The C Programming Language》,原句为“The scope of an external variable or a function lasts from the point at which it is declared to the end of the file being compiled.”