C核心技术手册(十)

 标识符范围

  标识符的范围即程序所能“看到”标识符的部分,范围的类型通常由你声明变量的地方决定(除过标签,它往往具有函数范围),下面是四种可能的范围:

  文件域:

          如果你在所有的程序块和参数列表这外声明了一个标识符,那么它将具有文件域,声明之后在任意地方使用它直到翻译单元结束。

        块域:

          除过标签,在块中声明的标识符具有块域,你只能在声明它的最小块域中使用它,最小块域通常为一个函数的函数体,在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具有文件原型域,变量firstptr具有块域。

  在一个嵌套中,可以声明一个外部已经声明的标识符,,即使新标识符名称相同,如果你这样做,新标识符将有块或函数原型域,且块域或函数原型域将是一外层域的真子集,在这种场景下,内部标识符隐藏了外部的声明,所以外部声明的变量或函数在内部是不可见的,例如,下面的声明是请允许的:

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核心技术手册(十))