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

时间:2019-05-24 04:43:11

标签: c++ c enums

说我有一个列出所有人员的主要枚举:

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

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

以下内容似乎无效(编译器抱怨redeclaration of enumerator ‘TONY’等:

typedef enum male_personnel {
    TONY,
    MIKE,
    JIM,
} male_personnel_t;

2 个答案:

答案 0 :(得分:6)

here所述,您可以在C ++中通过使用如下范围枚举(C ++ 11)来做到这一点

enum class all_personnel_t { TONY, MARY };
enum class male_personnel_t { TONY };

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

namespace all
{
    enum all_personnel_t { TONY, MARY };
}
namespace male
{
    enum male_personnel_t { TONY };
}

答案 1 :(得分:5)

C

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

按照C11标准:

  

6.2.3 Name spaces of identifiers

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

C ++

如果使用scoped enumerations,则在C ++中是可能的。

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

enum class male_personnel {
    TONY,
    MIKE,
    JIM,
} ;

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

因此无法进行以下操作:

male_personnel mp2 = all_personnel::TONY; //will not work
all_personnel ap2 = male_personnel::MIKE; //will not work   

这也不是:

male_personnel mp1 = male_personnel::MIKE; 
all_personnel ap1 = all_personnel::TONY; 
mp1 = ap1; //will not work

请参见Demo