一个有意思的warning.

今天看下属的代码才发现的,之前还真没碰到过。

 
#include <stdio.h>
int main()
{
        for (int i=0; i<10; ++i)
        {
                for (int i=0; i<10; ++i)
                {
                        ;
                }
                int x = i;
        }
        return 0;
}

gcc编译:

 
debian:~$ gcc t.cc
t.cc: In function ‘int main()’:
t.cc:10: warning: name lookup of ‘i’ changed
t.cc:4: warning:   matches this ‘i’ under ISO standard rules
t.cc:6: warning:   matches this ‘i’ under old rules

vc编译:

 
D:\tmp>cl c.cc
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
 
Copyright (C) Microsoft Corporation.  All rights reserved.
 
c.cc
c.cc(10) : warning C4258: 'i' : definition from the for loop is ignored; the def
inition from the enclosing scope is used
        c.cc(6) : definition of 'i' ignored
        c.cc(4) : definition of 'i' used

如果去掉int x = i;那一行,就没有这个warning。

这个倒也比较好理解,按照旧规则和新规则,int x=i有两种不同的解释,分别对应两个不同scope里的i。所以就给个warning。

此条目发表在开发分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*