【问题标题】:How to cast / assign one enum value to another enum如何将一个枚举值转换/分配给另一个枚举
【发布时间】:2015-04-06 15:16:04
【问题描述】:

我在 2 个不同的模块中有 2 个枚举,它们具有完全相同的值集。如何将一个转换为另一个?

typedef EnumA{
a_dog = 0,
a_cat = 1
} EnumA;

typedef EnumB{
b_dog = 0,
b_cat = 1
} EnumB;

EnumA a = a_dog;
EnumB b;

b = a;

这样的赋值会导致警告:枚举类型与另一种类型混合 我可以通过类型转换避免 switch-case,比如说

b = (int)a;

b = (EnumB)a;

【问题讨论】:

  • 你试过了吗?
  • 如果两者都具有完全相同的值集,为什么要同时定义它们?只需定义一个并在两个模块中使用那个。无论如何,将一个枚举转换为另一个枚举并不总是一个好主意。它应该可以工作。
  • 哪个编译器/工具(带有哪些选项)会导致警告?标准没有任何要求(gcc -std=c99 -pedantc -Wall -Wextra 不会发出任何要求)。
  • 我也没试过。我用 gmake

标签: c enums


【解决方案1】:

enum 类型是整数类型,您可以将任何整数值分配给任何整数对象。

这是有效的,标准不需要诊断。然而,当您尝试混合不同的 enum 类型时,一些实现会发出警告。

要使警告静音,最好不要混淆枚举类型,否则我建议将其强制转换为枚举类型。

 b = (EnumB)a;

除非你的编译器真的很聪明,否则:

b = (int)a;

也应该像enum 常量是int 类型一样工作,并且当正确的enum 常量(类型int)分配给与enum 类型相关的右侧时,编译器不应该发出警告。

【讨论】:

    【解决方案2】:

    我根据您的问题制作了一个工作代码。您错过了类型定义中的 enum

    typedef enum EnumA
    {
        a_dog = 0,
        a_cat = 1
    } EnumA;
    
    typedef enum EnumB
    {
        b_dog = 0,
        b_cat = 1
    } EnumB;
    
    int main()
    {
        EnumA a = a_dog;
        EnumB b;
    
        b = (EnumB) a;
        printf("%d\n", b);
        return 0;
    }
    

    代码b = a 在没有演员表的情况下也可以正常工作。 b = (int) a; 也在工作——至少在 C11 中,因为 enums 实际上只是整数。无论如何,恕我直言,进行明确的演员表是一种很好的做法。

    【讨论】:

    猜你喜欢
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2010-09-11
    相关资源
    最近更新 更多