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 variable
sp和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.”