我了解第一个,但第二个?何时和为什么要这样做?使用不带变量名的枚举
enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE };
enum { HOMER, MARGE, BART, LISA, MAGGIE };
我了解第一个,但第二个?何时和为什么要这样做?使用不带变量名的枚举
enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE };
enum { HOMER, MARGE, BART, LISA, MAGGIE };
您可以在类,这使得它的范围定义这样的枚举,并有助于揭露类的功能,例如,
class Encryption {
public:
enum { DEFAUTL_KEYLEN=16, SHORT_KEYLEN=8, LONG_KEYLEN=32 };
// ...
};
byte key[Encryption::DEFAUTL_KEYLEN];
这只是创建具有相应值的常量表达式,而不不仅仅是int
之外的类型,所以你不能用一个无名枚举作为一种什么,你将不得不简单地接受int
和然后与常数进行比较。
事情是这样的:
void doSomething(int c);
对战是这样的:
void doSomething(cartoon c);
顺便说一句,你的实现是相同的,所以在无名枚举的情况下,唯一真正的缺点是强大的打字。
除了它们实际上不是常量,它们是*常量表达式*。有时会有很大的差异。例如,您可以将参考或地址作为常数。你不能用enum符号来做到这一点。 – 2011-01-07 17:40:06
枚举,联合,结构和类在语法中有一个共同部分共享相同的 这个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;
第二个是未命名的enum
。当你需要这些字段时,我可以很有用,但是你不打算声明这个枚举类型的变量。为了提供一个“非常C++”的使用示例,您经常会在模板元编程中看到这一点,其中枚举被用作“编译时返回值”,而无需声明此类变量:
template<class T>
struct some_metafunction
{
enum { res = 0; };
};
我只是提供了一个现实生活中使用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]
好得多。
当你看过多辛普森一家? – 2011-01-07 07:37:11
没有这样的东西.. – 2011-01-07 07:44:10
@Noah:你让我觉得这可能确实是非法的,而且我误导了,所以我在g ++中编译了一个类似于我的例子的测试。它编译并运行正常,虽然我检查过的在线引用确实没有显示这个语法选项。 – davka 2011-01-07 08:42:57