C/C :提取一个枚举的子集以形成新的枚举
C/C++: extract a subset of one enum to form a new enum
说我有一个主枚举列出所有人员:
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标识符的名称空间
- 因此,各种标识符都有单独的名称空间,如下:
...
- 所有其他标识符,称为普通标识符(在普通声明器中声明或为枚举常数(。
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
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 标准::可选枚举的比较运算符
- C++两个源文件之间共享的枚举的静态实例
- 打印没有铸件的枚举可以在C++中吗?
- 枚举成员与静态 int 成员?
- C++:枚举:错误:应使用标识符而不是"}"
- 带有 c++ 的枚举(输入检查)
- C/C :提取一个枚举的子集以形成新的枚举
- 使用 DFS 枚举子集
- 只允许枚举的子集作为返回值 - 或 如何让编译器提醒我?在C++