在枚举中重新声明变量

msc*_*msc 6 c c++ enums declaration language-lawyer

在C中,如果我们在内部重新声明变量enum,那么编译器会给出一个错误"'我'重新声明为不同类型的符号".好的.

#include <stdio.h>

int i = 10;

struct S 
{ 
    enum 
    {
        i = 20
    }e; 
};

int main()
{
    printf("%d\n", i);
}
Run Code Online (Sandbox Code Playgroud)

但是,在C++中,如果我们在枚举中重新声明变量,那么它的工作正常.

#include <iostream>
using namespace std;

int i = 10;

struct S 
{ 
    enum 
    {
        i = 20
    }e; 
};

int main()
{
    cout<<i<<endl;
}
Run Code Online (Sandbox Code Playgroud)

我不明白,为什么C++编译器没有给重新声明变量带来错误?

Sto*_*ica 10

它没有给出重新声明错误,因为枚举器被引入类范围.回想一下,结构和类在C++中大多可以互换.范围S包含枚举器i.

但是,在C中,struct S没有定义范围.C中只有4种类型的范围:函数,文件,块和函数原型.因此,i将其引入i已定义变量的文件范围.