0

在我的 C++03 组件之一中,我正在从 enum 转移到 global const int。enum{ RED=0, GREEN, BLUE };改为const unsigned int RED = 0, GREEN = 1, BLUE = 2;

问题是对于全局 const 变量,您应该显式初始化每个值。ex 具有 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 文件。在新的解决方案中,他们只需要外部全局变量并使用它。

4

2 回答 2

3

您不应该将良好的工作方式更改为更糟糕的方式。

你的枚举到底有什么问题?甚至 Scott Meyers 也同意“枚举 hack”是公平的游戏,枚举器比 const ints 更接近命名文字。*顺便说一句,隐式静态也是一种黑客攻击)。

于 2013-06-20T13:11:00.070 回答
1

看起来很简单。我错过了什么?

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

现在,如果您决定删除GREEN, 的定义BLUE将不会编译,直到您将其更改为使用RED而不是 `GREEN. 之后的所有值都可以;他们将向下移动 1。

于 2013-06-20T13:40:43.340 回答