【问题标题】:Terminology definition - Scope in C application术语定义 - C 应用程序中的范围
【发布时间】:2023-03-25 11:10:02
【问题描述】:

以下类型的 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?

谢谢!

【问题讨论】:

    标签: c scope


    【解决方案1】:

    范围定义为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 被称为具有原型作用域。

    选择最小范围

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

    【讨论】:

    • 感谢您进行非常彻底和有益的讨论。我不知道各个级别范围的正式名称。
    • @GirLovesTacos 还有一个作用域——词法作用域! .. 谷歌吧! :)
    【解决方案2】:

    我会说你正在引入一个新的本地范围,或者一个嵌套范围,或者一个

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

    {
        std::lock_guard<std::mutex> lk(my_mutex);
    
        do_critical_stuff();  // might throw exception?
    }
    // the lock is released automagically!
    

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

    【讨论】:

    • “引入新的本地范围”是我一直在寻找的短语。谢谢!
    【解决方案3】:

    术语是范围

    K&R2 将词范围定义为

    一个名字也有一个作用域,它是程序所在的区域 众所周知

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 2011-05-18
      • 2019-05-27
      • 2013-05-30
      相关资源
      最近更新 更多