C核心技术手册(十)
2010-12-04 00:26
295 查看
标识符范围
标识符的范围即程序所能“看到”标识符的部分,范围的类型通常由你声明变量的地方决定(除过标签,它往往具有函数范围),下面是四种可能的范围:文件域:
如果你在所有的程序块和参数列表这外声明了一个标识符,那么它将具有文件域,声明之后在任意地方使用它直到翻译单元结束。
块域:
除过标签,在块中声明的标识符具有块域,你只能在声明它的最小块域中使用它,最小块域通常为一个函数的函数体,在C99中,声明不必放在函数块的最前面,在一个函数中定义的参数名也具有块域,在函数体中有效。
函数原型域:
函数原型中的参数名具有函数原型域,因为这些参数名在原型外没有意义,它们往往用做注释,可被忽略。
函数域:
标签的范围通常为它所出现在函数块,即使它出现在嵌套的块中,换句话说,你可以使用goto语句跳到同一函数中任意具有此标签的地方(跳进一个嵌套的块中是个不好的主意)。
一个标识符的范围从它定义之后就开始,但是,结构体,标签,联合体、枚举类型和枚举常量是个例外,它们的范围在声明出现后即开始,所以它们可以在声明本身中再次引用,下面的为一个结构体类型的声明,最后一个成员为结构next,是一个刚声明的结构的指针:
struct Node { /* ... */ struct Node *next; }; // Define a structure type void printNode( const struct Node *ptrNode); // Declare a function int printList( const struct Node *first ) // Begin a function definition { struct Node *ptr = first; while( ptr != NULL ) { printNode( ptr ); ptr = ptr->next; } }
在这个代码段中,标识符node, next, printNode 和printList均有文件域,参数ptrNode具有文件原型域,变量first和ptr具有块域。
在一个嵌套中,可以声明一个外部已经声明的标识符,,即使新标识符名称相同,如果你这样做,新标识符将有块或函数原型域,且块域或函数原型域将是一外层域的真子集,在这种场景下,内部标识符隐藏了外部的声明,所以外部声明的变量或函数在内部是不可见的,例如,下面的声明是请允许的:
double x; // Declare a variable x with file scope long calc( double x ); // Declare a new x with function prototype scope int main( ) { long x = calc( 2.5 ); // Declare a long variable x with block scope if( x < 0 ) // Here x refers to the long variable { float x = 0.0F; // Declare a new float variable x with block scope /*...*/ } x *= 2; // Here x refers to the long variable again /*...*/ }
在本例中,long类型的变量x声明在main()中,隐藏了double类型的变量x,因此,在main()中没有办法直接访问double类型的变量x,此外,if条件块中,float型变量x又隐藏了long类型的变量x。
相关文章推荐
- C核心技术手册(四)
- C核心技术手册(十八)
- 《Red5 用户参考手册》之九:Red5 核心技术第二章 将 Red5 部署到 Tomcat
- 《Red5 用户参考手册》之十二:Red5 核心技术第五章 脚本实现
- C核心技术手册(三十九)
- C核心技术手册(四)
- C核心技术手册(十四)
- C核心技术手册(十八)
- C核心技术手册(二十四)
- 《Red5 用户参考手册》之十:Red5 核心技术第三章 自定义流路径
- C核心技术手册(二十六)
- C核心技术手册(二十七)
- 《Red5 用户参考手册》之十:Red5 核心技术第三章 自定义流路径
- 《Red5 用户参考手册》之十一:Red5 核心技术第四章 安全
- 《Red5 用户参考手册》之十二:Red5 核心技术第五章 脚本实现
- C核心技术手册(三十九)
- C核心技术手册(四十一)
- C核心技术手册(十四)
- R语言核心技术手册pdf
- C核心技术手册(十九)