C++ 使用不带变量名的枚举

C++ 使用不带变量名的枚举,c++,C++,我能理解第一个,但第二个?你什么时候为什么要这么做 enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE }; enum { HOMER, MARGE, BART, LISA, MAGGIE }; 这只会创建具有相应值的常量表达式,而不是简单的int,因此您不能将未命名的枚举用作任何类型,您只需接受int,然后与常量进行比较 大概是这样的: void doSomething(int c); void doSomething(cartoon c);

我能理解第一个,但第二个?你什么时候为什么要这么做

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

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

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

大概是这样的:

void doSomething(int c);
void doSomething(cartoon c);
而不是像这样的东西:

void doSomething(int c);
void doSomething(cartoon c);

顺便说一句,您的实现是相同的,因此在未命名枚举的情况下,唯一真正的缺点是强类型。

enum、union、struct和class在语法中有一个相同的公共部分 这种未修改的模式很少使用。 但有时你会发现这一点

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; };
};
模板
构造一些元函数
{
枚举{res=0;};
};

您可以在类中定义这样的枚举,这给了它一个作用域,并有助于公开类的功能,例如

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

byte key[Encryption::DEFAUTL_KEYLEN];

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

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

uint8_t ROM_AGE[END_AGE]
如果我们在此处定义一个异常枚举:

enum { HOMER_AGE, MARGE_AGE, BART_AGE, LISA_AGE, MAGGIE_AGE, END_AGE };
然后,可以使用enum中的关键字索引每个字符的年龄,如
ROM\u age[HOMER\u age]

通过使用该枚举,可读性比使用
ROM\u AGE[0]要好得多。

=0部分实际上是必要的吗?@Jacob这不是,但它只是一个示例(通常
res
的值取决于
T
),现在我明白了,我想知道您是如何使用/访问它的。所以它将它引入范围,并通过执行ClassName::enum值来使用它,因此基本上enum{blah,hah,lol}可以通过ClassName::blah等进行访问。谢谢。@Noah:你让我觉得这可能确实是非法的,而且我有误导性,所以我在g++上编译了一个类似下面例子的测试。它编译和运行正常,尽管我检查过的在线引用确实没有显示这个语法选项。除了它们不是常量之外,它们是常量表达式。有时会有很大的不同。例如,您可以获取常量的引用或地址。不能使用枚举符号执行此操作。最后一个条目
END_AGE
可以用作计数器,因为它的值是匿名枚举的条目数。因此,我们可以在for循环中循环
ROM\u AGE
,就像在
for(inti=0;i)中一样