作用域
当变量在程序的某个部分被声明时,只有在程序的一定区域内才能被访问。这个区域由标示符(变量、函数、类型等的名字)的作用域决定。而标示符的作用域是指程序中该标示符可以被使用的区域。例:函数的局部变量的作用域限于该函数的函数体,意思是:1.其他函数无法通过这些变量的名字访问它们2.不同作用域的变量可以重名。
编译器将作用域分为四种:文件作用域、函数作用域、代码块作用域、原型作用域。
- 代码块作用域
- 文件作用域
- 原型作用域
- 函数作用域
代码作用域
相关定义
代码块:一对花括号之间的所有语句成为一个代码块。
代码块作用域:任何在代码块开始位置声明的标示符都具有代码块作用域,表示它可以被代码块中的所有语句访问。
举例说明
- 代码
int a; //1
int b( int c); //2
int d( int e ) //3
{
int f; //4
int g( int h ); //5
...
{
int f, g, i; //6
...
}
{
int i; //7
...
} //上面的倒数第一个i的作用域到此终止
}
代码示例得出的结论:
- 当代码块处于嵌套状态时,声明于内层代码块的标示符的作用域到达该代码块的尾部终止。
- 内层代码块有一个标示符的名字与外层代码块的一个标示符的名字同名时,内层的那个标示符会将外层的标示符隐藏—外层的那个标示符无法在内层代码块中通过名字访问。上述示例代码中声明6中的f会将声明4中的f隐藏。
注:实际中应避免在嵌套的代码块中出现相同的变量名。 - 在非嵌套的情况下,声明于每个代码块的变量无法被另一个代码块访问,因为它们的作用域无重叠之处。
注:由于两个代码块的变量不可能同时存在,所以编译器可以把它们存储于同一个内存地址。
文件作用域
- 所有在代码块之外声明标示符都具有 文件作用域,作用域是从标示符声明之处开始到它所在源文件结尾处都是可以访问的。示例中的a,b属于这一类。
- 在文件中定义的函数名也具有文件作用域,因为函数名不属于任何代码块
- 在头文件中编写并通过#include指令包含到其他文件中的声明就如同它们直接写在那些文件中一样。它们的作用域并不仅限于头文件的文件结尾。
原型作用域
- 原型作用域只适用于在函数原型中声明的参数名,如示例中的变量c、h。
- 在原型中(与函数定义时不同)参数名并非必需。函数原型中的参数名是任意的,可以和函数定义时的形参名、函数调用时所传递的实参名都不一样。唯一可能存在的冲突是在同一个原型中不止一次的使用同一个名字。
函数作用域
- 实际中不会使用,可以不必了解。