在枚举中重新声明变量

Redeclare variable inside enum

在 C 中,如果我们在 enum 中重新声明变量,那么编译器会给出一个错误“'i' 重新声明为不同类型的符号”。没问题。

#include <stdio.h>

int i = 10;

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

int main()
{
    printf("%d\n", i);
}

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

#include <iostream>
using namespace std;

int i = 10;

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

int main()
{
    cout<<i<<endl;
}

我不明白,为什么 C++ 编译器不给出重新声明变量的错误?

它不会给出重新声明错误,因为枚举器被引入到 class 范围内。回想一下,struct 和 class 在 C++ 中几乎可以互换。 S 的范围包含枚举器 i.

然而,在 C 中,struct S 没有定义作用域。 C 中只有 4 种作用域:函数、文件、块和函数原型。因此,i 被引入到已经定义了变量 i 的文件范围内。