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

在枚举定义中使用先前定义的成员作为后续成员的一部分是否合法?

  •  6
  • Geoff  · 技术社区  · 16 年前
    namespace ValueType {
      enum Enum {
        Boolean = 0,
        Float = 1,
        Double,
        SInt = 8,
        SLong,
        UInt = SInt + (1 <<4),
        ULong = SLong + (1 << 4)
      };
    }
    
    2 回复  |  直到 16 年前
        1
  •  12
  •   Jerry Coffin    16 年前

    enum { d, e, f=e+2 };
    
        2
  •  1
  •   Community Mohan Dere    9 年前

    正如所指出的 Jerry

    在某些罕见的情况下,它会意识到枚举器的类型只有在枚举完全定义后才能指定。该标准对枚举类型(7.2/4)有如下规定:

    每个枚举都定义了一个不同于所有其他类型的类型。在枚举说明符的右括号之后,每个枚举器都有其枚举的类型。在结束大括号之前,每个枚举器的类型是其初始化值的类型。如果为枚举器指定了初始化器,则初始化值的类型与表达式的类型相同。 如果没有为第一个枚举器指定初始化器,则该类型是未指定的整型 否则,该类型与前一个枚举器的初始化值的类型相同,除非递增的值在该类型中不可表示,在这种情况下,该类型是一个未指定的整数类型,足以包含递增的值。

    突出显示的句子可以在以下示例中显示:

    enum E {
      E0            // Unspecified type
      , E1 = E0-1   // -1, or MAX_UINT
      , E2          // 0 or (MAX_UINT+1)
    };
    

    基本上,选择的类型 E0 影响结果值 E1 .