使用没有变量名的枚举

时间:2011-01-07 07:35:42

标签: c++

我理解第一个但第二个?你何时以及为什么这样做?

enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE };

enum { HOMER, MARGE, BART, LISA, MAGGIE };

5 个答案:

答案 0 :(得分:27)

您可以在中定义此类枚举,从而为其提供范围,并有助于公开类的功能,例如:

class Encryption {
public:
  enum { DEFAUTL_KEYLEN=16, SHORT_KEYLEN=8, LONG_KEYLEN=32 };
  // ...
};

byte key[Encryption::DEFAUTL_KEYLEN];

答案 1 :(得分:6)

这只是创建具有相应值的常量表达式,而不是简单int之外的类型,因此您不能使用未命名的枚举作为任何类型的类型,您只需要接受{{ 1}}然后与常量进行比较。

这样的事情:

int

这样的事情:

void doSomething(int c);

顺便说一下,你的实现方式是一样的,所以对于未命名的枚举,唯一真正的缺点是强类型。

答案 2 :(得分:6)

第二个是未命名的enum。当你需要字段时我会很有用,但你不打算声明这个枚举类型的变量。

为了提供一个'非常C ++'的使用示例,你会经常在模板元编程中看到这一点,其中枚举被用作'编译时返回值',而无意声明这种类型的变量:

template<class T>
struct some_metafunction
{
    enum { res = 0; };
};

答案 3 :(得分:4)

枚举,联合,结构和类在语法共享中有一个共同点 可以使用这种未命名的模式。 但有时你可能会发现这一点。

typedef enum { HOMER, MARGE, BART, LISA, MAGGIE } cartoont;

或者,如果您只有一个只包含少数状态的变量。

enum { HOMER, MARGE, BART, LISA, MAGGIE } my_var;

这样可以避免以下声明。

enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE };
cartoon my_var;

答案 4 :(得分:4)

我只是提供了我在嵌入式项目中遇到的anonyous枚举的真实示例。 在该项目中,EEPROM用于存储一些参数。假设这些参数是纸箱特征的年龄,每个参数在连续地址中的大小为1个字节。

当处理器开启时,这些参数被复制到存储在ROM中的数组中。

uint8_t ROM_AGE[END_AGE]

如果我们在这里定义一个不合理的枚举:

enum { HOMER_AGE, MARGE_AGE, BART_AGE, LISA_AGE, MAGGIE_AGE, END_AGE };

然后,枚举中的关键词可用于索引每个字符的年龄,如ROM_AGE[HOMER_AGE]。 通过使用此枚举,可读性比使用ROM_AGE[0]要好得多。