好的,我有这个代码,我知道这不是很好的编程习惯。我忘记了它的名字。
int main()
{
int variable;
{
int variable;
}
}
这是一个本地命名空间还是什么?我只是记不起那样做的事情的正确用语。
答案 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)
我认为你所指的是变量隐藏或变量阴影。通过在内部作用域中声明一个与外部作用域同名的变量,您将隐藏内部作用域中的外部变量。显然,在更复杂的代码中,这可能会令人困惑。
答案 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)
它简称为变量的范围。允许我们定义相同的变量名变量。