范围定义为the area in which the object is active。 C中有五个作用域,如下所示。
计划范围
这些是最顶层的声明。它们在程序的生命周期内都可用。所有函数都有这个范围。这也称为全局范围。
文件范围
它具有可以从该点到文件末尾进行访问的范围。
void dummy(void) { }
// absence of static automatically gives program scope to `dummy()`
static void dummy(void) { }
// static keyword here gives function `dummy()` a file scope
功能范围
只有标签有这个范围。在此范围内,它们一直处于活动状态,直到函数结束。
void printFun()
{
print:
printf(“i is less than j”);
}
int main()
{
int i=1,j=2;
if(i < j)
goto print;
}
此代码将被编译器标记为错误,指出标签打印未知,因为标签只有函数范围。如果必须在函数之间无条件跳转,则必须使用setjmp/longjmp 函数。
块范围
在块结束前一直处于活动状态的声明(其中块被定义为{ } 中的语句)。函数内的所有声明都只有块范围。
int fun(int a, int b)
{
int c;
{
int d;
}
// a, b, c, d all have block scope
}
正如我所说,函数范围仅适用于标签。所以不应与块作用域混淆。函数参数被视为与其他变量一起在块的开头声明(请记住,函数体也被视为{ } 中的块)。所以函数参数有块作用域(不是函数作用域)。
本地作用域是指函数作用域或块作用域的一般用法。
原型范围
它们的范围仅在原型声明内。这个作用域很有意思,因为变量名只在原型声明中有效,不与其他变量名冲突。它存在的时间很短,使用较少,因此被忽视。
int add(int a, float b);
这里的变量a 和b 被称为具有原型作用域。
选择最小范围
当必须解析名称时,会在最小范围内搜索该名称,如果不可用,则在更高级别的范围内搜索。因此,如果必须声明变量,则必须选择可能的最小范围。如果你可以限制你的范围,那会提高你的程序的效率、可读性和可维护性。如果您想要一个在块外无用的变量,请在块内而不是在外部声明它。同样,如果您想要一个变量,其值只能在函数内访问,但必须在函数调用之间保留值,请选择静态变量而不是全局变量。