您的位置:首页 > 其它

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: