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