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

C++双枚举值赋值

  •  0
  • RoQuOTriX  · 技术社区  · 8 年前

    在一个开源代码中,我发现了一个枚举初始化,如下所示:

    enum example {
        FIRST,
        FIRST_AGAIN = FIRST,
        SECOND,
        ETC
    };
    

    我很惊讶枚举的值将如何初始化,因为 FIRST_AGAIN 会得到价值 0 因为 FIRST 也一样。但我认为这会影响 第一 价值 -1 ,当 第一次\u 值是 .

    所以我用调试器查找了赋予关键字的值。 第一 分配给 .

    所以,我的问题是,是否真的允许(GCC编译它,但是C++标准是怎么说的?)在一个枚举中指定两个值相同的关键字?编译器是如何翻译作业的?因为要知道 第一 ,编译器应该首先检查整个枚举,并查看是否分配了任何关键字,从那里返回,他可以分配所有其他值,但他不知道分配了什么。 FIRST_AGAIN = FIRST 手段。

    也许这个问题很愚蠢,做这种事是很常见的。为两个关键词赋予相同的值有什么好处?

    1 回复  |  直到 8 年前
        1
  •  2
  •   user743382    8 年前

    所以,我的问题是,是否真的允许(GCC编译它,但是C++标准是怎么说的?)在一个枚举中指定两个值相同的关键字?

    没关系。C++标准在规范文本中没有提到任何内容,所以它是含蓄的,但也包括一个例子:

    enum { a, b, c=0 };
    

    它定义了 a c 为零。

    编译器是如何翻译作业的?因为要知道 FIRST ,编译器应该首先遍历整个枚举

    不,编译器不需要这样做。没有显式值的枚举器定义不依赖于以后的枚举器定义。它的值是前一个枚举器的值加上一个,如果没有前一个枚举器,则为零。

    也许这个问题很愚蠢,做这种事是很常见的。为两个关键词赋予相同的值有什么好处?

    一种可能性:

    enum E {
      A = 20,
      B = 30,
      C = 40,
      MIN = A,
      MAX = C
    }
    

    在这里,可以预期 MIN MAX 可以随着枚举数的添加或删除而更改,但 A , B C 预计将保持不变。通过使用 C 在哪里? C 被通缉,以及 马克斯 如果需要一个范围,代码可能是任何库定义此枚举的更高版本的未来证明。