Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;分步枚举 我试图在C++中写一个EnUM,而不是八步,比如 enum { foo, bar = 8, baz = 16, };_C++_C - Fatal编程技术网

C++;分步枚举 我试图在C++中写一个EnUM,而不是八步,比如 enum { foo, bar = 8, baz = 16, };

C++;分步枚举 我试图在C++中写一个EnUM,而不是八步,比如 enum { foo, bar = 8, baz = 16, };,c++,c,C++,C,将有很多条目,新条目将每隔一段时间添加,为了清楚起见,它们确实希望按照条目顺序以外的顺序编写,因此不必手动不断更新所有数字会很好。我尝试过使用宏预处理器技巧,但到目前为止还没有成功。有没有一种方法可以让我忽略这个问题? < p>我不太清楚你在问什么,但是这种方法会自动在8步中生成值,并使在枚举的中间插入新的值变得相对容易,并使所有的值更新以适应变化: int foo, bar, baz; baz = 8 + bar = 8 + foo; enum { foo,

将有很多条目,新条目将每隔一段时间添加,为了清楚起见,它们确实希望按照条目顺序以外的顺序编写,因此不必手动不断更新所有数字会很好。我尝试过使用宏预处理器技巧,但到目前为止还没有成功。有没有一种方法可以让我忽略这个问题?

< p>我不太清楚你在问什么,但是这种方法会自动在8步中生成值,并使在枚举的中间插入新的值变得相对容易,并使所有的值更新以适应变化:

int foo, bar, baz;

baz = 
8 + bar =  
8 + foo; 
enum { foo, bar = foo + 8, baz = bar + 8 } 枚举 { 福, bar=foo+8, baz=巴+8 } 编辑以添加“新值”后,您将有:

enum { foo, bar = foo + 8, newvalue = bar + 8, baz = newvalue + 8 } 枚举 { 福, bar=foo+8, 新值=巴+8, baz=newvalue+8 } 您还可以使用“步长”常量,以便(a)以后改变对该步长的看法,以及(b)阻止任何人意外添加错误的步长:

const int EnumStep = 8; enum { foo, bar = foo + EnumStep, baz = bar + EnumStep } 常量int EnumStep=8; 枚举 { 福, bar=foo+EnumStep, baz=条+步 } 这并不理想,因为您将拥有所有这些额外功能,但您将拥有正确位置的枚举

#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 ); } 枚举{ foo=0, bar=foo+8, baz=巴+8, };

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

您可以执行以下操作:

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

另一种方法要求为
枚举
,例如
条目.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
};

我喜欢这样的东西:

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

foo=(0另一种避免使用(禁止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)
};

赞成的意见
  • 内存占用小
  • 您可以轻松更改步骤和基准,而无需更新每个条目
  • 您可以在任何位置轻松删除和添加条目
欺骗
  • 你必须写上一个条目

那么它们就不是固定的表达方式了。这就是他的想法:他希望能够在任何时候“滑动”一个,并将其纳入+8计划。
#define USE_MYENUM(value) (value*8)

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

CallFunction(USE_MYENUM(MyEnum));
#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)
};