簡體   English   中英

C++ 枚舉分步

[英]C++ enum by step

我正在嘗試在 C++ 中以八步而不是一步編寫等效於枚舉的枚舉,例如

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

會有很多條目,每隔一段時間就會添加新的條目,為了清楚起見,他們真的想按照條目順序以外的順序編寫,所以不必手動更新所有數字會很好. 我嘗試過使用宏預處理器技巧,但到目前為止還沒有骰子。 有沒有辦法做到這一點,我忽略了?

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

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

我更喜歡這樣的事情:

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

它不是自動化的,但在添加新的枚舉常量時不需要太多思考。

我不太確定你在問什么,但這種方法將在 8 步自動生成值,並使得在枚舉中間插入新值變得相對容易,並更新以下所有值以適應更改:

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

編輯添加“新值”后,您將擁有:

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

您還可以使用“步驟”常量,以便您可以 (a) 稍后改變您對步驟的看法,以及 (b) 阻止任何人意外添加錯誤的步驟:

const int EnumStep = 8;

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

您可以執行以下操作:

#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
};

#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 ); }

另一種方法需要一個單獨的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
};
#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

它並不理想,因為您將擁有所有這些附加功能,但您將在正確的位置擁有您的枚舉。

避免使用(MISRA 禁止的)## 運算符或創建額外的枚舉/條目的另一種可能性是:

#define USE_MYENUM(value) (value*8)

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

CallFunction(USE_MYENUM(MyEnum));

當然,最好將USE_MYENUM (或更可能是MyEnum*8 )放入CallFunction()以便完成類型檢查。

遵循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)
};

優點

  • 內存占用小。
  • 您可以輕松更改步驟和基礎,而無需更新每個條目。
  • 您可以在任何地方輕松刪除和添加條目。

缺點

  • 你必須寫上一個條目。
int foo, bar, baz;

baz = 
8 + bar =  
8 + foo; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM