我理解第一个但第二个?你何时以及为什么这样做?
enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE };
enum { HOMER, MARGE, BART, LISA, MAGGIE };
答案 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]
要好得多。