好的,所以我有这段代码,我知道这不是好的编程习惯。我只是忘记它叫什么了。
int main()
{
int variable;
{
int variable;
}
}
那是本地命名空间还是什么?我只是不记得做这样的事情的正确术语。
好的,所以我有这段代码,我知道这不是好的编程习惯。我只是忘记它叫什么了。
int main()
{
int variable;
{
int variable;
}
}
那是本地命名空间还是什么?我只是不记得做这样的事情的正确术语。
这{ ... }
是一个块或复合语句,它创建一个嵌套范围。(这不是一个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
;您必须明确启用它。)
我认为您指的是变量隐藏或变量阴影。通过在内部范围内声明一个与外部范围同名的变量,您将外部变量隐藏在内部范围之外。显然,在更复杂的代码中,这可能会令人困惑。
您正在隐藏现有变量。这不是好的编程习惯。
出于兴趣,Java 禁止它。
这里有两个概念,一个是在该块范围内创建一个,一个是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
我将其称为范围。我想这也是其他人所说的。
它被简单地称为变量的范围。c 允许我们定义相同的变量名称变量。