Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;在子作用域中重新声明变量不会导致编译错误(如果应该的话)?_C++_Visual Studio 2010 - Fatal编程技术网

C++ C++;在子作用域中重新声明变量不会导致编译错误(如果应该的话)?

C++ C++;在子作用域中重新声明变量不会导致编译错误(如果应该的话)?,c++,visual-studio-2010,C++,Visual Studio 2010,我遇到了一个案例,我必须交换掉某个对象的值。由于我自己的草率复制和粘贴,我也意外地复制了类型声明。以下是一个简化的示例: int main() { int i = 42; cout << "i = " << i++ << endl; // ... much later if( isSwapRequired == true ) { int i = 24; cout << "i

我遇到了一个案例,我必须交换掉某个对象的值。由于我自己的草率复制和粘贴,我也意外地复制了类型声明。以下是一个简化的示例:

int main()
{
    int i = 42;
    cout << "i = " << i++ << endl;

    // ... much later

    if( isSwapRequired == true )
    {
        int i = 24;
        cout << "i = " << i++ << endl;
    }
    cout << "i = " << i++ << endl;
}
intmain()
{
int i=42;

cout根据标准制定的规则,这个程序是完全有效和正确的,编译器不需要捕获任何东西,也没有任何东西需要捕获

该标准允许相同的命名变量存在于各自的范围内,并明确定义了在特定范围内使用时将引用哪个变量的规则。相同命名变量隐藏阴影全局范围内的变量

在本地范围内(在条件
if
块内),本地声明的
i
隐藏全局
i
。如果需要在此范围内访问全局
i
,则需要使用
::i

在条件块之外,唯一存在的
i
是全局声明的
i


对评论中问题的答复:

尽管编译器实际上不必对此发出警告,但如果您在编译程序时启用了最高警告级别,或者明确告诉编译器警告此特定行为,大多数编译器都会为您提供此诊断

对于,可以使用
-Wshadow

-乌斯哈多

每当本地变量或类型声明遮蔽另一个变量、参数、类型或类成员(C++)或每当内置函数被遮蔽时,警告:注意,在C++中,编译器警告如果局部变量隐藏显式的Type,但如果它隐藏了结构/类/枚举,则不可见。


这不是多重声明,因为每个
i
s都有不同的作用域,并且局部作用域总是有利于全局作用域

如果要从
main()的顶层使用
i
,请使用
::i


参见教程。

这不是编译器错误。它只是C++语言的工作方式:代码块可以声明变量到它们的范围内。C++不是Python……这就是“范围”。意思是。我从未学过。我一直认为编译器无法解析引用的变量。感谢您指出这一点。不客气。这与它背后的实际机器代码有关,如果您感兴趣,请查找
stackframe
。我现在了解到编译器是根据然而,我有时会犯命名相同的错误(尤其是迭代器,因为我很快就没有办法将
it
作为一个缩写拼写出来)。我现在想知道为什么编译器不发出类似于已声明但未使用的变量的警告?@Morpork:检查上面,更新以回答您的问题。感谢您扩展您的答案。顺便说一句,我尝试在Visual Studio 2010上使用/Wall激活所有警告,但它仍然没有对此发出警告。我必须小心。(我浏览了一下发现)