2011-01-07 149 views
26

我了解第一个,但第二个?何时和为什么要这样做?使用不带变量名的枚举

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

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

当你看过多辛普森一家? – 2011-01-07 07:37:11

+4

没有这样的东西.. – 2011-01-07 07:44:10

+0

@Noah:你让我觉得这可能确实是非法的,而且我误导了,所以我在g ++中编译了一个类似于我的例子的测试。它编译并运行正常,虽然我检查过的在线引用确实没有显示这个语法选项。 – davka 2011-01-07 08:42:57

回答

24

您可以在类,这使得它的范围定义这样的枚举,并有助于揭露类的功能,例如,

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

byte key[Encryption::DEFAUTL_KEYLEN]; 
6

这只是创建具有相应值的常量表达式,而不不仅仅是int之外的类型,所以你不能用一个无名枚举作为一种什么,你将不得不简单地接受int和然后与常数进行比较。

事情是这样的:

void doSomething(int c); 

对战是这样的:

void doSomething(cartoon c); 

顺便说一句,你的实现是相同的,所以在无名枚举的情况下,唯一真正的缺点是强大的打字。

+0

除了它们实际上不是常量,它们是*常量表达式*。有时会有很大的差异。例如,您可以将参考或地址作为常数。你不能用enum符号来做到这一点。 – 2011-01-07 17:40:06

4

枚举,联合,结构和类在语法中有一个共同部分共享相同的 这个unamed模式是rarelly使用。 但有时您可能会发现这一点。

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; 
6

第二个是未命名的enum。当你需要这些字段时,我可以很有用,但是你不打算声明这个枚举类型的变量。为了提供一个“非常C++”的使用示例,您经常会在模板元编程中看到这一点,其中枚举被用作“编译时返回值”,而无需声明此类变量:

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

我只是提供了一个现实生活中使用anonyous enum的例子,我在嵌入式项目中遇到过。 在该项目中,EEPROM用于存储一些参数。假设这些参数是纸箱字符的年龄,每个参数在连续地址中的大小为1个字节。

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

uint8_t ROM_AGE[END_AGE] 

如果我们定义了一个anomymous枚举这里:

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

然后枚举的关键词可被用于索引每个角色的年龄一样ROM_AGE[HOMER_AGE]。 通过使用这个枚举,可读性比使用ROM_AGE[0]好得多。