繁体   English   中英

术语定义-C应用范围

[英]Terminology definition - Scope in C application

以下类型的C代码是否有特定术语? 在我的示例中,我想增加函数中一小段代码的作用域深度,而不必使用不必要的if / else / for语句,以便可以多次重新声明具有相同名称的变量。 例如:

void myfunc(void) {
  int a = 0, b = 1;
  {
    int c;
    c = 3;
    printf("c is: %d", c);
  }

  a = 2;
  {
    int c = 5;
    printf("c is %d", c);
  }

}

用什么术语来描述我如何用花括号将一些代码包装起来并增加作用域深度,以使该函数的其余部分看不到'c'int?

谢谢!

范围定义为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);

在这里,变量ab被认为具有原型范围。

选择最小范围

当必须解析名称时,将在最小范围内搜索该名称,如果该名称不可用,则会在较高范围内搜索该名称。 因此,如果必须声明变量,则必须选择一个最小范围。 如果可以限制范围,则可以提高程序的效率,可读性和可维护性。 如果要在块外使用的变量无效,请在块内而不是外部变量中声明。 同样,如果您想要一个仅在函数内访问其值但必须在函数调用之间保留该值的变量,则将静态变量选择为全局变量。

我想你是在引入一个新的本地范围嵌套范围

当您积极利用此功能时,这在C ++中变得非常重要:

{
    std::lock_guard<std::mutex> lk(my_mutex);

    do_critical_stuff();  // might throw exception?
}
// the lock is released automagically!

但是即使在C语言中,最好还是只在需要的地方使用变量,而不要将它们放到不必要的范围内。

该术语是范围

K&R2将单词范围定义为

名称也具有作用域,即它在其中已知的程序区域

范围是指标识符的可见性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM