“函数最外层的局部变量可能不使用与任何参数相同的名称”是什么意思?

时间:2015-05-08 13:56:43

标签: c++ parameters scope local-variables

我一直在阅读C ++入门第5版。在第6.1章的函数参数列表的第三段中。 它写道“此外,函数最外层的局部变量可能不会使用与任何参数相同的名称”。 这是什么意思?

我不是英语母语人士。我不理解函数“最外层范围”的实际含义。

5 个答案:

答案 0 :(得分:24)

函数的最外层是定义函数体的块。您可以将其他(内部)块放在其中,并在该块的本地变量中声明变量。内部块中的变量可以与外部块中的变量或函数参数具有相同的名称;他们将名称隐藏在外部范围内。外部块中的变量不能与函数参数同名。

演示:

void f(int a)           // function has a parameter
{                       // beginning of function scope
    int b;              // OK: local variable
    {                   // beginning of inner block
        int a;          // OK: hides parameter
        int b;          // OK: hides outer variable
    }                   // end of inner block
    int a;              // Error: can't have same name as parameter
}

答案 1 :(得分:16)

这意味着你不能做这样的事情:

void foo (int x)
{
    int x = 4; //in the outermost scope, invalid
}

但是,你可以这样做:

void foo (int x)
{
    { //this introduces a new scope
        int x = 4; //not in the outermost scope, valid
    }
}

答案 2 :(得分:7)

这意味着这是无效的:

void f(int p)
{
   int p = 3;
}

此时

void f(int p)
{
  {
    int p = 3;
  }
}

是允许的。

答案 3 :(得分:4)

此规则不仅适用于函数定义的函数参数,还适用于迭代和条件语句以及异常处理程序

3.3.3阻止范围

  

2函数参数名称的潜在范围(包括一个   出现在lambda声明符中)或函数本地预定义   函数定义(8.4)中的变量从它的角度开始   宣言。如果该函数具有函数 - 尝试阻止该电位   参数或函数本地预定义变量的范围结束   在最后一个关联的处理程序的末尾,否则它结束于   函数定义的最外面的块的结尾。一个参数   名称不得在函数的最外层重新声明   定义也不在与a关联的任何处理程序的最外面的块中   功能的try块。

     

3异常声明中声明的名称是本地的   处理程序,不得在最外面的块中重新声明   处理程序。

     

4在for-init语句中声明的名称,for-range-declaration,   并且在if,while,for和switch语句的条件下   if,while,for或switch语句的本地语句(包括   受控声明),不得在随后重新声明   该陈述的条件也不在最外面的块中(或者,对于if   声明,受控声明的任何最外面的块;   见6.4。

例如,此代码段无效

if( int x = SomeFunction() )
{
    int x; // invalid declaration
    //...
}

答案 4 :(得分:2)

想象一下,你有一个带有整数参数'bar'的函数'foo'。

int foo (int bar)
{
    int bar = 0; // < illegal, this is the 'outermost' scope
    if (bar == 10) {
        int bar = 5; // legal (though unadvisable) this 'shadows' the passed-in 'bar'
        return bar;
    }
    return bar;
}

'bar'的第一个内部声明是非法的,因为传入的参数也在同一个上下文中声明(即使语法不一定清楚。)

正如写作不正确:

int bar;
char bar[10];

由于这两个变量共享相同的范围。

bar的第二个声明(在上面的函数foo中)是合法的(虽然通常是一个坏主意)因为它是在'if'因此公平游戏的内部范围内声明的。

希望有所帮助。