2009年12月5日星期六

C学习之作用域

1.代码块作用域
位于一对花括号之间的所有语句称为一个代码块。任何在代码块的开始位置声明的标识符都具有代码块作用域(block scope),表示它们可以被这个代码块中的所有语句访问。
当代码块处于嵌套状态时,声明于内层代码块的标识符作用域到达该代码块的尾部便告终止。然而,如果内层代码块有一个标识符的名字与外层代码块的一个标识符同名,内层的那个标识符就将隐藏外层的标识符--外层的那个标识符无法在内层代码块中通过名字访问。
不是嵌套的代码块则稍有不同。声明于每个代码块的变量无法被另一个代码块访问,因为它们的作用域并无重叠之处。由于两个代码块的变量不可能同时存在,所以编译器可以把它们存储于同一个内存地址。这个共享不会带来任何危害,因为在任何时刻,两个非嵌套的代码块最多只有一个处于活动状态。

2.文件作用域
任何在所有代码块之外声明的标识符都具有文件作用域(file scope),它表示这些标识符从它们的声明之处到它所在的源文件结尾处都是可以访问的。在文件中定义的函数名也具有文件作用域,因为函数名本身并不属于任何代码块。应该指出的时,在头文件中编写并通过#include指令包含到其他文件中的声明就好像它们是直接写在那些文件中一样。它们的作用域并不局限于头文件的文件性。

3.原型作用域
原型作用域(prototype scope)只适用于在函数原型中声明的参数名。在原型中(与函数的定义不同),参数的名字并非必需。但是,如果出现参数名,可以给它们取任何名字,它们不必与函数定义中的形参名匹配,也不必与函数实际调用时所传递的实参匹配。原型作用域防止这些参数名与程序其他部分的名字冲突。事实上,唯一可能出现的冲突就是在同一原型中不止一次地使用同一个名字。

4.函数作用域
最后一种作用域的类型是函数作用域(function scope)。它只适用于语句标签,语句标签用于goto语句。基本上,函数作用域可以简化为一条规则--一个函数中的所有语句标签必须唯一。

没有评论: