我忘了这叫什么了?

时间:2013-09-18 19:23:46

标签: c++ namespaces scope

好的,我有这个代码,我知道这不是很好的编程习惯。我忘记了它的名字。

int main()
{
    int variable; 
    {
        int variable;
    }
}

这是一个本地命名空间还是什么?我只是记不起那样做的事情的正确用语。

6 个答案:

答案 0 :(得分:8)

{ ... }复合语句,它会创建嵌套的范围。 (这不是namespace。)

这个特殊情况下,内部作用域中的声明与外部作用域中的声明具有相同的名称(因此隐藏),有时也称为 shadowing

g ++可以对此发出警告。引用the manual

`-Wshadow'
     Warn whenever a local variable or type declaration shadows another
     variable, parameter, type, or class member (in C++), or whenever a
     built-in function is shadowed. Note that in C++, the compiler will
     not warn if a local variable shadows a struct/class/enum, but will
     warn if it shadows an explicit typedef.

(正如Adam Rosenfield在评论中指出的那样,-Wshadow-Wall-Wextra未启用-pedantic;您必须明确启用它。)< / p>

答案 1 :(得分:3)

我认为你所指的是变量隐藏或变量阴影。通过在内部作用域中声明一个与外部作用域同名的变量,您将隐藏内部作用域中的外部变量。显然,在更复杂的代码中,这可能会令人困惑。

http://en.wikipedia.org/wiki/Variable_shadowing

答案 2 :(得分:2)

遮蔽现有变量。这不是一个好的编程实践。

出于兴趣,Java禁止它。

答案 3 :(得分:0)

我称之为范围。我认为这也是其他人所说的。

答案 4 :(得分:0)

这里有两个概念,一个是你在block scope内创建一个{ ... },你在这个块范围内隐藏了variable的外部实例。如果我们查看C ++草案标准部分6.3 复合语句或块或块)正在创建块作用域> 1 具有以下语法:

compound-statement:
  { statement-seqopt}

它还说:

  

复合语句定义块范围(3.3)。

如果我们查看3.3.3 部分,3.3.3块范围 1 说:

  

块(6.3)中声明的名称是该块的本地名称;它有块范围。其潜在范围从其声明点(3.3.2)开始,到其块结束时结束。在块作用域中声明的变量是局部变量。

所以variable发生的事情是内部块中的本地副本是hiding外部块中variable的实例,因为它具有相同的名称。

答案 5 :(得分:0)

它简称为变量的范围。允许我们定义相同的变量名变量。