C / C ++:提取一个枚举的子集以形成一个新的枚举

bru*_*uin 4 c c++ enums

假设我有一个列出所有人员的主枚举:

typedef enum all_personnel {
     // male
     TONY,
     MIKE,
     JIM,
     // female
     JESSICA,
     MARY,
} all_personnel_t;
Run Code Online (Sandbox Code Playgroud)

现在,我想为雄性和雌性定义另外两个枚举(例如,因为某些函数只使用male或female枚举参数),但是我想使用与主枚举相同的名称标识符。在C / C ++中可以吗?还是有其他方法?

似乎以下内容不起作用(编译器抱怨redeclaration of enumerator ‘TONY’等):

typedef enum male_personnel {
    TONY,
    MIKE,
    JIM,
} male_personnel_t;
Run Code Online (Sandbox Code Playgroud)

小智 6

如前所述在这里,您可以通过使用范围的枚举为此在C ++(C ++ 11)如下

enum class all_personnel_t { TONY, MARY };
enum class male_personnel_t { TONY };
Run Code Online (Sandbox Code Playgroud)

或者您可以按如下方式将枚举放入命名空间中

namespace all
{
    enum all_personnel_t { TONY, MARY };
}
namespace male
{
    enum male_personnel_t { TONY };
}
Run Code Online (Sandbox Code Playgroud)


P.W*_*P.W 5

C

在C中这是不可能的,因为作用域中来自不同枚举的所有枚举常量都是称为普通标识符名称空间的同一名称空间的一部分。因此,对常量使用相同的名称将导致重新声明错误。

根据C11标准:

6.2.3标识符的命名空间

  1. 因此,对于各种类别的标识符,存在单独的名称空间,如下所示:
    ...-
    所有其他标识符,称为普通标识符(在普通声明中声明为枚举常量)。

C ++

如果使用范围枚举,则在C ++中是可能的。

enum class all_personnel {
     // male
     TONY,
     MIKE,
     JIM,
     // female
     JESSICA,
     MARY,
} ;

enum class male_personnel {
    TONY,
    MIKE,
    JIM,
} ;
Run Code Online (Sandbox Code Playgroud)

但是,请注意,没有从范围内的枚举器的值到整数类型或从一个范围内的枚举器到另一范围内的枚举器的隐式转换。这是因为每个枚举器都成为该枚举类型的命名常量。

因此,以下是不可能的:

male_personnel mp2 = all_personnel::TONY; //will not work
all_personnel ap2 = male_personnel::MIKE; //will not work   
Run Code Online (Sandbox Code Playgroud)

这也不是:

male_personnel mp1 = male_personnel::MIKE; 
all_personnel ap1 = all_personnel::TONY; 
mp1 = ap1; //will not work
Run Code Online (Sandbox Code Playgroud)

观看演示