【发布时间】:2021-11-02 08:51:27
【问题描述】:
这是Extend enum with additional values 的后续问题。由于 gcc 版本 11,那里建议的解决方案(我认为这是 C 中的常见做法)在像这样应用 -Wall 时会发出编译器警告:
enum abc { A, B, C, };
enum def { D = C + 1, E, F };
int
foo(enum def bar)
{
if (bar == A) {
return 1;
}
return 0;
}
警告内容如下:
warning: comparison between 'enum def' and 'enum abc' [-Wenum-compare]
显然,您可以通过使用显式强制转换来消除警告:
\\ ...
if (bar == (enum def) A) {
\\ ...
这里是实际问题:
- 有没有更方便的方法?
- 扩展枚举的建议模式毕竟是正确的做法吗?
编辑:关于switch 声明,我没有看到一种简单的方法(例如使用强制转换)来消除警告:
int
foo2(enum def bar)
{
switch (bar)
{
case A:
return 0;
case D:
return 1;
default:
return 2;
}
}
【问题讨论】:
-
警告没有给你答案吗?
-
不,这是正确的方式。
-
我不明白你为什么要这么做。
-
对我来说这听起来像是一个 XY 问题。你为什么做这个。你试图解决的真正问题是什么。
-
why in C++ extending enums became part of the language你能提供一个参考吗?我不知道你想表达什么意思。 stackoverflow.com/questions/1804840/extending-enums-in-c 会回答你的问题吗?enums in C is a well-known problem and the way how it was solved above is not uncommon可以举个例子吗?通常在 C 中,您将每个枚举值放在命名空间中,因此它将是enum abc { ABC_A, ABC_B, ABC_C }; enum def { DEF_A = ABC_A, DEF_B = ABC_B, .... etc.}。使用重复的枚举元素污染全局命名空间听起来像是一种不好的做法和意大利面条代码。