作用域
编译器可以确认四种不同的作用域--文件作用域、函数作用域、代码块作用域和原型作用域。标识符声明的位置决定它的作用域。
1.代码块作用域
位于一对花括号之间的所有语句成为一个代码块。任何在代码块的开始位置声明的标识符都具有代码块作用域,表示它们可以被这个代码块
中的所有语句访问。函数定义的形式参数(5)在函数内部也具有代码块作用域。
当代码块嵌套时,声明于内层代码块的标识符的作用域到达该代码块的尾部便告终止。
如果内层代码块有一个标识符的名字与外层代码块的一个标识符同名,内层的那个标识符将隐藏外层的那个标识符--外层的那个标识符将无法
在内层通过名字访问
int a; //1
int b_func (int c); // 2 3
int d_func (int e) // 4 5
{
int f; //6
int g_func (int h); //7 8
...
{
int f, g, i; //9
...
}
{
int i; //10
...
}
}
6 9 中的f是不同的变量,后者无法在内层代码中通过名字访问。
不是嵌套的代码块的情况下,声明于每个代码块的变量无法被另一个代码块访问,因为他们的作用域并无重叠之处。
由于两个代码块的变量不 可能同时存在,所以编译器可以把它们存储于同一个内存地址。例如,10处的i和9处的任何一个
变量共享同一个内存地址。这种共享不会带来任何危害,因为在任何时刻,两个非嵌套的代码块最多只有一个处于活动状态。
形参的作用域为函数最外层的那个作用域(也就是整个函数体)
2.文件作用域
任何在所有代码块之外声明的标识符都具有文件作用域(file scope),表示这些标识符从它们的声明之处到它所在的源文件结尾处
都是可以访问的。1和2,在文件中定义的函数名也具有文件作用域,因为函数名本身并不属于任何代码块,如4。在头文件中
编写并通过#include指令包含到其他文件中的声明就好像它们是直接写在那些文件中一样。它的作用域不局限于头文件的文件尾。
3.原型作用域
原型作用域(prototype scope)只适用于在函数原型中声明的参数名。如3和8。在原型中(与函数的定义不同),参数的名字并非必需。
但是,如果出现参数名,可以取任何名字,不必与函数定义中的形参名匹配,也不必与函数实际调用时所传递的实参匹配。
4.函数作用域
阅读(1567) | 评论(0) | 转发(0) |