作用域就是程序中该变量可以被使用的区域。
//标识符作用域示例int a; //1int b(int c); // 2,3int d(int e) // 4,5{int f; //6int g(int h); //7,8{int f,g,i; //9}{int i; //10}}
1.代码块作用域
位于一对花括号之间的所有语句就称为一个代码块。任何在代码块开始位置声明的标识符都具有代码块作用域,可以被代码块中所有语句访问,例如注释6,7,9,10处的变量。函数定义的形参在函数体内也具有代码块作用域。
当代码块处于嵌套状态时,在代码块中声明的标识符的作用域在代码块的尾部终止。如果内层代码块的标识符的和外层代码块相同,内层代码块会屏蔽外层代码块的标识符,即外层代码块中的标识符在内层代码块中无法通过名字访问。注释6,9处f是不同变量,6在9处代码块中无法通过名字来访问。所以应该在避免在嵌套的代码块中使用相同的变量名,以免引起混淆。
非嵌套的代码块的作用域没有重叠之处,在任何时刻最多只有一个处于活动状态,因此编译器可以让两个代码块中的变量共享同一内存地址,而不会发生错误。
2.函数作用域
函数中所有的语句标签必须唯一。
3.文件作用域
任何在所有代码块之外声明的标识符和函数名都具有文件作用域,范围是从声明处到文件结尾。在头文件中编写并通过#include包含到其他文件中的声明,就好像它们只写在那些文件中一样,作用域不限于头文件的结尾。
4.原型作用域
只适用于函数原型中声明的参数名,此处的参数并非必须,如果有,不必与函数定义中的形参一致,也不必与调用时的实参一致。唯一可能出现冲突。就是在同一个原型中不止一次的用了同一个名字。