可以根据同一枚举类型中的其他枚举数来定义枚举数吗?

21 c c++ enums

为了好奇,我正在试验这个:

enum RxqType
{
    A = (1 << 0),
    B = (1 << 1),
    C = (A | B),
    D = A+B+C
};
Run Code Online (Sandbox Code Playgroud)

枚举器C和D是根据较早的枚举器定义的.这很不寻常,所以我不确定它是否安全.我无法通过谷歌找到它的例子(虽然可能会忽略).

这似乎是罚款时,我printf还是cout CD基于Visual C++ 2013和MinGW.但我担心它是否符合标准,是否会触发未定义的行为.

任何人都可以回答我对标准一致性和未定义行为的担忧吗?还有什么我需要关注的吗?

oua*_*uah 21

enum RxqType
{
    A = (1 << 0),
    B = (1 << 1),
    C = (A | B),
    D = A+B+C
};
Run Code Online (Sandbox Code Playgroud)

在C和C++中,这是有效的.

对于C:

(C11,6.2.1p7)"每个枚举常量的范围都是在枚举器列表中出现其定义枚举器之后开始的."

对于C++:

(C++ 11,3.3.2p4)"枚举器的声明点紧跟在枚举器定义之后."


Sha*_*our 5

是的,这在C99标准部分标准草案中有所涉及,它6.2.1 标明了每个枚举数在定义后的范围内:

每个枚举常量都具有在枚举器列表中定义枚举器出现之后开始的范围.

这在C++标准草案部分3.3.2 的声明有所说明:

枚举的声明点紧跟在enum-specifier(7.2)或其第一个opaque-enum-declaration(7.2)中的标识符(如果有)之后,以先到者为准.

为了完整起见,我们可以转到C99标准草案的6.7.2.2 枚举说明符部分,它告诉我们一个枚举器可以通过常量表达式设置,枚举器本身是一个常量表达式.

enumerator:
    enumeration-constant
    enumeration-constant = constant-expression
Run Code Online (Sandbox Code Playgroud)

常量表达式中包含什么是6.6 常量表达式,它告诉我们枚举数是常量,并且整数常量的算术表达式也是常量表达式.