- 作用域:程序中可以访问的一个标识符的一个或多个区域。
- 分类:
a. 代码块作用域 block scope
b. 函数原型作用域 function prototype scope
c. 文件作用域 file scope
d. 函数作用域 function scope - 代码块作用域 block scope
一个代码块是指包含在一对花括号之内的一段代码(可嵌套)。在代码块中定义的变量具有代码块作用域,变量从被定义处到包含该定义的代码块末尾均可见。
1)整个函数体是一个代码块:
void swap(double &d1, double &d2) {
double dtmp = d1;
d1 = d2;
d2 = dtmp;
}
a. dtmp 具有代码块作用域;
b. 函数的形参也具有代码块作用域,比如上面例子中的 d1 和 d2。
2)函数内任一复合语句是一个代码块:
void display(char c, int itimes) {
for (int i = 0; i < itimes; ++i)
printf("%c\n", c);
}
上面例子中 for 循环是一个代码块,变量 i 具有代码块作用域。
4. 函数原型作用域 function prototype scope
函数原型作用域适用于函数原型中使用的变量名。
a. 通常情况下,函数原型中只关心形参的类型,名字无关紧要甚至可以忽略;
b. 函数原型中名字起作用的一种情形是变长数组的参数:
void use_a_VLA(int irow, int icol, iarr[irow][icol]);
- 文件作用域 file scope
一个定义在所有函数之外的变量具有文件作用域。该变量从挑定义处到包含该定义的文件的结尾处均可见。
文件作用域变量即全局变量(global variable)。 - 函数作用域域 function scope
注意区别于函数原型作用域。C 语言中的函数作用域只适用于 goto 语句使用的标签,一个函数中的 goto 标签在该函数中的任意地方可见,与标签出现的位置无关(区别于代码块作用域)。