我正在使用eclipse IDE和MSVC进行C开发。 我注意到编译器没有给出在嵌套for循环中使用相同索引变量的警告。
为什么不发出警告,我怎样才能发现这种潜在的编程错误?
此致 斯里尼瓦萨
答案 0 :(得分:2)
如果在块中声明的变量并且在封闭块中重新声明,则新声明会临时隐藏先前的声明。
int a[5][5];
for(int i = 0; i < 5; i++)
{
for(int i = 0; i < 5; i++)
{
//Previous i is not visible
scanf("%d", &a[i][i]);
}
//No knowledge of i in inner loop.
}
答案 1 :(得分:0)
MSVC中没有这样的警告。即使使用/ Wall进行编译,并包含默认情况下关闭的所有警告(http://msdn.microsoft.com/en-us/library/23k5d385.aspx),也不会在子范围内声明具有相同名称的变量时收到警告。一些静态代码分析器会报告这些类型的错误,我建议使用一个,或者与另一个编译器交叉编译以获得更好的覆盖率。
答案 2 :(得分:0)
我今天遇到了这个问题,我正在使用从标准C移植到C ++的函数。虽然我还没有做过任何认真的研究,但我怀疑没有发出任何警告,因为在内部范围内定义一个类似命名的变量被认为是合法的。这让我措手不及,导致几个小时的浪费,试图弄清楚为什么应该满足其终止条件的do-while循环无限执行。
我无法防范的原因是Visual C#编译器在您执行此操作时会发出警告。 C#警告非常具体;你只是隐藏了一个在外部块中声明的变量Foo。经过一番努力,我确认最新的Visual C ++编译器仍然以这种方式运行。
我喜欢C#方法;允许它,但发出警告。