1

好的,所以我有这段代码,我知道这不是好的编程习惯。我只是忘记它叫什么了。

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

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

4

6 回答 6

8

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

这种特殊情况下,内部范围中的声明与外部范围中的声明具有相同的名称(因此隐藏)有时称为遮蔽

g++ 可以对此发出警告。引用手册

`-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;您必须明确启用它。)

于 2013-09-18T19:26:23.733 回答
3

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

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

于 2013-09-18T19:28:31.273 回答
2

您正在隐藏现有变量。这不是好的编程习惯。

出于兴趣,Java 禁止它。

于 2013-09-18T19:27:39.023 回答
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

于 2013-09-18T19:30:19.953 回答
0

我将其称为范围。我想这也是其他人所说的。

于 2013-09-18T19:25:29.070 回答
0

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

于 2013-09-18T19:38:28.437 回答