标识符的范围即程序所能“看到”标识符的部分,范围的类型通常由你声明变量的地方决定(除过标签,它往往具有函数范围),下面是四种可能的范围:
文件域:
如果你在所有的程序块和参数列表这外声明了一个标识符,那么它将具有文件域,声明之后在任意地方使用它直到翻译单元结束。
块域:
除过标签,在块中声明的标识符具有块域,你只能在声明它的最小块域中使用它,最小块域通常为一个函数的函数体,在C99中,声明不必放在函数块的最前面,在一个函数中定义的参数名也具有块域,在函数体中有效。
函数原型域:
函数原型中的参数名具有函数原型域,因为这些参数名在原型外没有意义,它们往往用做注释,可被忽略。
函数域:
标签的范围通常为它所出现在函数块,即使它出现在嵌套的块中,换句话说,你可以使用goto语句跳到同一函数中任意具有此标签的地方(跳进一个嵌套的块中是个不好的主意)。
一个标识符的范围从它定义之后就开始,但是,结构体,标签,联合体、枚举类型和枚举常量是个例外,它们的范围在声明出现后即开始,所以它们可以在声明本身中再次引用,下面的为一个结构体类型的声明,最后一个成员为结构next,是一个刚声明的结构的指针:
在这个代码段中,标识符node, next, printNode 和printList均有文件域,参数ptrNode具有文件原型域,变量first和ptr具有块域。
在一个嵌套中,可以声明一个外部已经声明的标识符,,即使新标识符名称相同,如果你这样做,新标识符将有块或函数原型域,且块域或函数原型域将是一外层域的真子集,在这种场景下,内部标识符隐藏了外部的声明,所以外部声明的变量或函数在内部是不可见的,例如,下面的声明是请允许的:
在本例中,long类型的变量x声明在main()中,隐藏了double类型的变量x,因此,在main()中没有办法直接访问double类型的变量x,此外,if条件块中,float型变量x又隐藏了long类型的变量x。