使用递增值初始化全局变量

时间:2013-06-20 13:01:10

标签: c++ enums global-variables

在我的一个C ++ 03组件中,我将从枚举转移到全局const int。 enum{ RED=0, GREEN, BLUE };已更改为const unsigned int RED = 0, GREEN = 1, BLUE = 2;

问题是对于全局const变量,您应该显式初始化每个值。 e.x.拥有100个值的枚举,按顺序保持值非常困难。想象一下,你想要从这个枚举的中间删除一个值,这是一个很大的混乱(即在删除枚举后更改所有枚举值的值)!

我创建了这个解决方法,但不知道结果是否在不同的编译器和目标上得到保证。

#define CREATE_GLOBAL_COUNT(name, val) static unsigned int g_counter_##name = val
#define INC_GLOBAL_COUNT(name) g_counter_##name ++

CREATE_GLOBAL_COUNT(color, 0);

const int RED = INC_GLOBAL_COUNT(color), 
GREEN = INC_GLOBAL_COUNT(color), 
BLUE = INC_GLOBAL_COUNT(color);

编辑:主要动机是减少头文件之间的依赖关系。组件需要使用枚举应该包含enum_definition.h文件。在新的解决方案中,他们只需要外部全局变量并使用它。

2 个答案:

答案 0 :(得分:3)

你应该没有把改善工作的方式改变得更糟糕。

真的是你的问题是什么?甚至斯科特迈耶斯也同意“enum hack”是公平的游戏,而普查员的近似命名文字比const int更好。 *什么btw也是隐含静态的黑客攻击。

答案 1 :(得分:1)

似乎很简单。我错过了什么?

const int RED = 0;
const int GREEN = RED + 1;
const int BLUE = GREEN + 1;

现在,如果您决定删除GREEN,则BLUE的定义将无法编译,直到您将其更改为使用RED而非“绿色”。之后的所有值都可以;他们将减少1。