C ++枚举一步一步

时间:2009-09-22 21:31:48

标签: c++ c

我正在尝试用八步而不是一步来编写C ++中枚举的等价物,比如

enum
{
    foo,
    bar = 8,
    baz = 16,
};

会有很多条目,每隔一段时间会添加一个新条目,为了清楚起见,它们确实希望以不同于输入顺序的顺序编写,所以不必不断更新所有条目数字用手。我已经尝试过使用宏预处理器技巧,但到目前为止还没有骰子。有没有办法做到这一点,我忽略了?

10 个答案:

答案 0 :(得分:25)

#define NEXT_ENUM_MEMBER(NAME) \
    NAME##_dummy, \
    NAME = NAME##_dummy - 1 + 8

enum MyEnum {
   Foo,
   NEXT_ENUM_MEMBER(Bar),
   NEXT_ENUM_MEMBER(Baz),
   ...
};

答案 1 :(得分:8)

我更喜欢这样的东西:

enum {
    foo = (0 << 3),
    bar = (1 << 3),
    baz = (2 << 3),
};

它不是自动化的,但在添加新的枚举常量时不需要太多思考。

答案 2 :(得分:4)

我不太确定你在问什么,但是这种方法会在8的步骤自动生成值,并且在枚举的中间插入新值并使所有以下值更新以容纳相对容易改变:

  enum
  {
     foo,
     bar = foo + 8,
     baz = bar + 8
  }

编辑后添加“newvalue”,您将拥有:

  enum
  {
     foo,
     bar = foo + 8,
     newvalue = bar + 8,
     baz = newvalue + 8
  }

您还可以使用“Step”常量,以便您可以(a)稍后改变您对步骤的想法,并且(b)阻止任何人意外添加错误的步骤:

  const int EnumStep = 8;

  enum
  {
     foo,
     bar = foo + EnumStep,
     baz = bar + EnumStep 
  }

答案 3 :(得分:3)

您可以执行以下操作:

#define STEP 8
#define ADD_ENUM(X, M) X = STEP * (M)
enum {
    ADD_ENUM(Foo, 0),
    ADD_ENUM(Bar, 1),
    ADD_ENUM(Baz, 2),
    //.. and so on
};

答案 4 :(得分:2)

#include <stdio.h> 

enum{ foo = 0, bar = foo+8, baz = bar+8, };

int main(){ printf("foo: %i bar: %i baz: %i\n", foo, bar, baz ); }

答案 5 :(得分:1)

另一种方法需要enum的单独头文件,例如entries.h

enum
{
    ENTRY(foo),
    ENTRY(bar),
    ENTRY(baz)
};

然后,您可以使用以下

#define ENTRY(E) _ ## E
#include "entries.h"
#undef ENTRY
#define ENTRY(E) E = _ ## E * 8
#include "entries.h"
#undef ENTRY

生成

enum
{
    _foo,
    _bar,
    _baz
};

enum
{
   foo = _foo * 8,
   bar = _bar * 8,
   baz = _baz * 8
};

答案 6 :(得分:0)

int foo, bar, baz;

baz = 
8 + bar =  
8 + foo; 

答案 7 :(得分:0)

#define ENUM_ENTRY_PASTE( x )   x

#define ENUM_ENTRY_8_SPACING( x ) \
    x,      \
    ENUM_ENTRY_PASTE(x)2,   \
    ENUM_ENTRY_PASTE(x)3,   \
    ENUM_ENTRY_PASTE(x)4,   \
    ENUM_ENTRY_PASTE(x)5,   \
    ENUM_ENTRY_PASTE(x)6,   \
    ENUM_ENTRY_PASTE(x)7,   \
    ENUM_ENTRY_PASTE(x)8

它并不理想,因为你将拥有所有这些额外的东西,但你会把你的枚举放在正确的地方。

答案 8 :(得分:0)

避免使用(MISRA禁止的)##运算符或创建额外的枚举/条目的另一种可能性是:

#define USE_MYENUM(value) (value*8)

enum
{
    foo = 0,
    bar,
    baz
} MyEnum = bar;

CallFunction(USE_MYENUM(MyEnum));

当然,最好将USE_MYENUM(或更可能MyEnum*8)放入CallFunction(),以便完成类型检查。

答案 9 :(得分:0)

遵循 Pavel Minaev 解决方案和答案中的其他一些想法,您可以执行以下操作

#define BASE 0
#define STEP 8
#define NEXT_ENUM_MEMBER(NAME,PREVIOUS) \
    NAME = PREVIOUS + STEP

enum MyEnum {
   Foo = BASE,
   NEXT_ENUM_MEMBER(Bar, Foo),
   NEXT_ENUM_MEMBER(Baz, Bar)
};

优点

  • 小内存占用。
  • 您可以轻松更改步骤和基准,而无需更新每个条目。
  • 您可以轻松地在任何地方删除和添加条目。

缺点

  • 您必须写上一个条目。