【问题标题】:Extend enum with additional values (follow up question)使用附加值扩展枚举(后续问题)
【发布时间】: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.}。使用重复的枚举元素污染全局命名空间听起来像是一种不好的做法和意大利面条代码。

标签: c enums


【解决方案1】:

有没有更方便的方法?

是的,避免在各种类型之间存在依赖关系的人为解决方案。

理论上,如果您知道它们具有相同的大小并且它们的常量值对应,则可以在两种枚举类型之间创建union。但这是一个相当有问题且可能不必要的复杂解决方案。

扩展枚举的建议模式毕竟是正确的做法吗?

可能不会。理想情况下,每个枚举都将是自包含的,其中包含它正在使用的所有常量。所以理想情况下:

enum def { DEF_A, DEF_B, DEF_C, DEF_D, DEF_E, DEF_F };

def 和 abc 之间缺乏紧密耦合并不是一件坏事 - 对 abc 的更改也应该静默自动更改 def 并不明显 - 这是一个潜在的来源细微的错误。

如有必要,可以创建从一种枚举类型到另一种枚举类型的转换例程。

【讨论】:

    猜你喜欢
    • 2014-10-02
    • 1970-01-01
    • 2010-12-10
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    相关资源
    最近更新 更多