开发者

The use of enum without a variable name

I understand the first one but the second one? When and why would you do that?

enum cartoon { HOMER, MARGE, BART, LISA,开发者_运维问答 MAGGIE };

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


you can define such enum in a class, which gives it a scope, and helps expose class's capabilities, e.g.

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

byte key[Encryption::DEFAUTL_KEYLEN];


This simply creates constant expressions that have the respective values, without a type other than simply int, so you can't use an unnamed enum as a type for anything, you will have to simply accept an int and then do comparison with the constant.

Something like this:

void doSomething(int c);

Versus something like this:

void doSomething(cartoon c);

By the way, your implementation would be the same, so in the case of unnamed enums, the only real drawback is strong typing.


The second is an unnamed enum. I can be useful when you need the fields, but you don't intend to ever declare a variable of this enumeration type.

To provide a 'very C++' example of its use, you will often seen this in template metaprogramming where the enum is used as a 'compile time return value' without the intent of ever declaring a variable of this type :

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


I am just providing a real life example use of anonyous enum, which I encountered in an embedded project. In the project, EEPROM is used to stored some parameters. Let's assume these parameters are those carton charater's ages, each parameter has the size of 1 byte in continuous address.

These parameters are copied into an array stored in ROM when the processor is powered on.

uint8_t ROM_AGE[END_AGE]

If we define an anomymous enum here:

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

Then the key words in enum can be used to index the age of each character like ROM_AGE[HOMER_AGE] . By using this enum, the readability is much better than using ROM_AGE[0].


enum, union, struct and class have a common part in the syntax share the same This unamed pattern is rarelly used. But sometime you may found this.

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

Or if you have a single variable containing only a few state.

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

This avoid the following declaration.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜