代码之家  ›  专栏  ›  技术社区  ›  foobarfuzzbizz

为什么我可以在C中设置匿名枚举,而不是C++?

  •  26
  • foobarfuzzbizz  · 技术社区  · 15 年前

    我有以下代码片段:

    enum { one } x;
    enum { two } y;
    x = y;
    

    这将在C中编译,但在C++中,我会得到以下错误:

    test.c:6: error: cannot convert ‘main()::<anonymous enum>’ to ‘main()::<anonymous enum>’ in assignment
    

    有人能解释一下为什么会这样吗?我更希望得到一个关于编译器为什么这样做的具体答案,而不是仅仅“你不能这样做”

    3 回复  |  直到 13 年前
        1
  •  34
  •   Steve Jessop    15 年前

    从一个枚举类型转换到另一个枚举类型需要通过整数类型(可能是源的基础类型,不确定)。

    在C和C++中允许从枚举到整数类型的隐式转换。在C中允许从整数类型到枚举的隐式转换,但不允许在C++中进行。

    基本上,C++是更安全的类型。它试图阻止你这样做:

    enum {zero, one, two} x;
    
    x = 143; // assigns a value outside the range of the enum
    

    如果您想在C++中执行这个枚举枚举转换,可以使用Type/DeCuff/Boost类型或等效。在海湾合作委员会:

    int main() {
        enum {zero, one, two} x;
        enum {zero1, one1, two1} y = two1;
        typedef typeof(x) xtype;
        x = static_cast<typeof(x)>(y);
    }
    

    不过,通常这样做是没有意义的。在大多数情况下,枚举(尤其是匿名枚举)是“枚举类型”。它们恰巧是C和C++标准作为“戴着滑稽帽子的整数”实现的,但这并不意味着 red 等于 hammer 只是因为它们分别出现在两个不同的枚举中(颜色和工具)。 static_cast 说明这两种类型之间有关系。任何两个枚举类型都是“相关”的,因为它们都有一个基本的整数类型,而且这些类型都是相关的,所以那里的“关系”并不能说明什么。如果你写这段代码,你会得到一个相当糟糕的类型安全版本。

        2
  •  1
  •   foraidt    15 年前

    我猜这是因为C++中更严格的打字。

    在C中 x = 5; 也可以编译。在C++中,因为没有定义类型转换。这与x=y不编译的原因相同。

    你可以看看 this example on codepad ,它给出了比编译器更详细的错误描述。

        3
  •  0
  •   semaj    15 年前

    编译器不知道如何隐式地将一个枚举数据类型转换为另一个枚举数据类型。

    试试下面的。

    enum typeX { one } x;
    enum typeY { two } y;
    x = (typeX) y;