局部范围和功能范围之间的差异

时间:2011-10-28 19:19:20

标签: c++ scope

一旦我认为这两个具有相同的含义,但在阅读了更多关于它之后,我仍然不清楚这些差异。局部范围有时不是指功能范围吗? 什么意思只有标签才有功能范围?

5 个答案:

答案 0 :(得分:15)

void doSomething()
{                                    <-------
     {                   <----               | 
                              |              |
         int a;           Local Scope    Function Scope
                              |              |
     }                   <----               | 
}                                    <------- 

功能范围介于外{ }

之间

本地范围介于内部{ }

之间

请注意,{``}创建的任何范围都可以作为本地范围调用,而函数体开头的{``}创建函数范围。
因此,有时局部范围可以与函数范围相同。

  

只有标签具有功能范围是什么意思?

Labels只是标识符后面跟冒号。标记语句用作goto语句的目标。标签可以在它们出现的函数中的任何位置使用,但不能在函数体外部引用。因此,据说它们具有功能范围。

代码示例:

int doSomething(int x, int y, int z)
{
     label:  x += (y + z);   /*  label has function scope*/
     if (x > 1) 
         goto label;
}

int doSomethingMore(int a, int b, int c)
{
     if (a > 1) 
         goto label; /*  illegal jump to undefined label */
}

答案 1 :(得分:4)

本地范围是{及其结束}之间的区域。函数范围是函数的开头{和它的结束}之间的区域,它可能包含更多的“本地”范围。标签在定义它的整个函数中是可见的,例如

int f( int a ) 
{
    int b = 8;
    if ( a > 14 )
    {
       int c = 50;
       label:
       return c - a - b;
    }
    if ( a > 7 ) goto label;
    return -99;
}
在其封闭区域外看不到

int c。标签在其封闭块外可见,但仅限于功能范围。

答案 2 :(得分:2)

  

本地范围有时不涉及功能范围吗?

是。在大多数C派生语言中,变量在声明它们的范围内有效。如果在函数内部声明变量,但不在任何其他代码块中声明,则该变量通常称为“本地”或“自动”变量。你可以在函数的任何地方引用它。另一方面,如果您在另一个代码块中声明您的变量 - 比如在条件语句的主体中,那么该变量仅在该块内有效。其他几个答案就是很好的例子。

  

并且只有标签具有功能范围是什么意思?

上下文会有所帮助,但这意味着你不能从一个函数跳转到另一个函数中的标签。

void foo(int a) {
    if (a == 0) goto here;  // okay -- 'here' is inside this function
    printf("a is not zero\n");
    goto there;             // not okay -- 'there' is not inside this function
here:
    return;
}

void bar(int b) {
    if (b == 0) goto there; // okay -- 'there' is in this function
    printf("b is not zero\n");
there:
    return;
}

不要激怒大黄蜂的巢穴,但标签的范围可能不会经常出现。标签主要用于goto语句,如果有的话很少需要,即使你确实选择使用goto,你甚至可能不会想到尝试跳转到另一个函数

答案 3 :(得分:1)

函数的范围略大于函数 body 的范围:函数参数在外部作用域中,而局部变量仅在内部作用域中。这在函数try-block中最明显:

void f(int a) try {
  // function body
} catch(...) {
  // catch block
}

在catch块中,只有函数作用域中的变量仍在范围内,而不是局部变量。

当然,您可以并且还会一直引入更深入的嵌套范围,例如:在for循环体或条件体中。

答案 4 :(得分:1)

bool m[3][3];
void f1()
{
  int i;
  // redefining a variable with the same name in the same scope isn't possible
  //int i; //error C2086: 'int i' : redefinition
}

void f2()
{
  int i; // ok, same name as the i in f1(), different function scope.

  {
    int i; // ok, same name as the i above, but different local scope.
  }

  // the scope if the following i is local to the for loop, so it's ok, too.
  for (int i = 0; i < 3; i++)
  {
    for (int j = 0; j < 3; j++)
    {
      if (m[i][j])
        goto loopExit;
    }
  }
loopExit:
  std::cout << "done checking m";
// redefining a label with the same name in the same function isn't possible
// loopExit:; // error C2045: 'loopExit' : label redefined
}

void f3()
{
loopExit:; // ok, same label name as in f2(), but different function scope
}