上一篇文章讲了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 variablefunction而言,它的scope是从它声明(declaration)的那一行起, 到所在文件的末尾[2]。如:

main() { ... }

/* define external variable sp and val */
int sp = 0;
double val[MAXVAL];

void push(double f) { ... }

double pop(void) { ... }

作为external variablespval可以用于函数pushpop,但是不可以用于函数main。 同样的,函数pushpop也不可以用于main

如果想在一个external variable的定义(definition)之前使用它,或者想在一个文件中使用 定义在另一个文件中的external variable,则需要对这个external variable进行强制的 extern声明。

因此,如果想要在main中使用spval,我们只需要在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.