为什么在嵌套'中使用相同的变量作为索引变量?循环没有发出警告?

时间:2015-01-12 13:35:11

标签: c eclipse visual-c++

我正在使用eclipse IDE和MSVC进行C开发。 我注意到编译器没有给出在嵌套for循环中使用相同索引变量的警告。

为什么不发出警告,我怎样才能发现这种潜在的编程错误?

此致 斯里尼瓦萨

3 个答案:

答案 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#方法;允许它,但发出警告。