Mor*_*ork 2 c++ visual-studio-2010
我遇到了一个必须换掉某个对象的值的情况.由于我自己的草率复制和粘贴,我不小心复制了类型声明.这是一个简化的例子:
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;
}
Run Code Online (Sandbox Code Playgroud)
让我感到沮丧的是,编译器没有抓住这一点,并进一步让它i = 24活在自己的小范围内.然后,事实证明,在范围之外,i仍然是43.我注意到如果两者i都处于同一级别,那么编译器肯定会抓住这个错误.编译器是否有理由以不同方式处理多个声明?
如果重要,我正在使用VS10.
根据标准规定的规则,该程序是完全有效和正确的,编译器不需要捕获任何东西,没有什么可以捕获的.
该标准允许同名变量在各自的范围存在,它明确的规则定义哪个当你特别scope.Same命名变量使用这些变量将引用隐藏或阴影在全局范围内的变量.
在本地范围内(在条件if块内),本地声明i隐藏全局i.如果您需要访问i此范围内的全局,则需要使用::i.
在条件块之外,唯一i存在的是全局声明的i.
在评论中回答问题:
虽然编译器实际上不必警告这一点,但是如果编译启用了最高警告级别的程序,或者您明确告诉编译器警告此特定行为,则大多数编译器将为您提供此诊断.
对于GCC,您可以使用-Wshadow.
-Wshadow
每当局部变量或类型声明影响另一个变量,参数,类型或类成员(在C++中)时,或者在内置函数被遮蔽时发出警告.请注意,在C++中,编译器会警告局部变量是否影响显式typedef,但如果它影响struct/class/enum则不会.
| 归档时间: |
|
| 查看次数: |
1334 次 |
| 最近记录: |