C中标识符有哪些类型的作用域?

作用域:

              当一个变量在程序的某个部分被声明时,它只有在程序的一定区域内才能被访问。而这个区域由变量的作用域(scope)决定。

              编译器可以确认4种不同类型的作用域-----文件作用域、函数作用域、代码块作用域和原型作用域。而变量声明的位置决定了它的作用域。

C中标识符有哪些类型的作用域?

      (1)、代码块作用域

       位于一对花括号之间的所有语句称为一个代码块。任何代码块的开始位置声明的变量都有代码块作用域,表示它们可以被这个代码块中的所有语句访问。上图中的6、7、9、10的变量都具有代码块作用域。函数定义中的形式参数在函数内部也具有代码块作用域。

       当代码块处于嵌套状态时,声明于内层代码块的变量的作用域到达改代码块的尾部便告终止。

       如果内层代码块有变量与外层代码块的变量重名,则内层的变量屏蔽外层的变量。外层的那个变量无发在内层通过变量名访问。例如上图所示,6所对应的变量在9所对应的变量所处的代码块中被屏蔽,在此处通过变量名 f 只能访问到9所对应的变量。

      (2)、文件作用域

       任何在所有代码块之外声明的标识符都具有文件作用域(file scope),它表示这些标识符从它们的声明之处直到它所处的源文件结尾处都是可以访问的。上图中的1,2都属于文件作用域。

      (3)、原型作用域

       原型作用域(prototype scope)只适用于在函数原型中声明的参数名,如上图中的3和8 。在原型中(与函数的定义不同,函数原型即函数声明),参数的名字并非必需要有。但是,如果出现参数名,你可以为它取任何合法的名字,它们不必与函数定义中的形参名匹配,也不必与函数实际调用时所传递的实参匹配。

       在原型作用域中唯一可能冲突的是:在一个函数原型中出现形式参数重名。

      (4)、函数作用域

       函数作用域只适用于语句标签,语句标签(类似于汇编语言中的标号)用于goto语句。基本上,函数作用域可以简化为一条规则----一个函数中的所有语句标签必须唯一。

       但这个知识希望永远不会使用!因为许多公司禁止使用goto语句,因为它跳来跳去会严重破坏程序的模块化。使得检错、维护的代价大大增加。