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

C/C++: extract a subset of one enum to form a new enum

本文关键字:枚举 子集 提取 一个      更新时间:2023-10-16

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

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;

如下所述,您可以在C 中使用示波器枚举(C 11(在C 中执行此操作。

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 };
}

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,
} ;

但是,请注意,从范围枚举器的值到积分类型或从一个范围的枚举器到另一个范围的枚举枚举器,没有隐含的转换。这是因为每个枚举者成为枚举类型的命名常数。

,以下是不可能的:

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