我有几个枚举作为类型常量。例如:
enum item_type {
street,
town,
lake,
border,
...
}
枚举值在代码中用于指定对象类型,并作为数据文件的一部分写入磁盘。这种方法效果很好,但有一个缺点:
如果不更改所有后续成员的整数值,则无法删除枚举成员(因为它不再使用)。因此,任何此类更改都会使代码与现有数据文件不兼容。
是否有一些很好的技术来避免这个问题?也许有些预处理技巧?
我能想到的唯一解决方案是显式设置所有整数值。虽然这样可行,但很难阅读和管理大型枚举。
注意:此问题来自Navit的源代码,它使用了几个类似的"类型枚举" (虽然它们实际上隐藏在一些宏之后)。
答案 0 :(得分:3)
如果您想很少删除项目,可以执行类似
的操作enum item_type {
street,
town,
//lake,
border = town+2,
...
}
即。只显示在您删除的项目之后立即为项目指定值。
由于兼容性对您来说非常重要,因此只需咬紧牙关并明确编号所有项目就更可靠
enum item_type {
street = 0,
town = 1,
//lake = 2,
border = 3,
...
}
答案 1 :(得分:0)
我最终声明了一个扩展为的宏UNUSED
UNUSED_<linenumber>
。然后,未使用的枚举值可以替换为
UNUSED
。宏在每一行上扩展为唯一标识符
因为否则编译器会抱怨重复的枚举
在一个枚举中多次使用的条目。
如果你有很多“空白”,这有点难看。不过,我选择了这个
simonc解决方案的解决方案,因为它易于阅读(保持常规枚举值不受视觉影响
杂乱如three=zero+2
)并且不需要幻数。
不可否认,只有差距很小且间隙很小,这才有意义。
对于较大的间隙,simonc的解决方案看起来更好。
完整示例:
#include <stdio.h>
#define UNUSED UNUSED_P(__LINE__)
#define UNUSED_P(x) UNUSED_P2(x)
#define UNUSED_P2(x) UNUSED_##x
enum e {
zero,
UNUSED,
UNUSED,
three,
};
int main(void){
printf("int value of 'three': %d\n",three);
return 0;
}
双重替换改编自以下问题: c++ - How, exactly, does the double-stringize trick work?。