从枚举中删除值而不更改其他值

时间:2014-06-04 20:20:32

标签: c enums refactoring c-preprocessor

我有几个枚举作为类型常量。例如:

enum item_type {
  street,
  town,
  lake,
  border,
...
}

枚举值在代码中用于指定对象类型,并作为数据文件的一部分写入磁盘。这种方法效果很好,但有一个缺点:

如果不更改所有后续成员的整数值,则无法删除枚举成员(因为它不再使用)。因此,任何此类更改都会使代码与现有数据文件不兼容。

是否有一些很好的技术来避免这个问题?也许有些预处理技巧?

我能想到的唯一解决方案是显式设置所有整数值。虽然这样可行,但很难阅读和管理大型枚举。

注意:此问题来自Navit的源代码,它使用了几个类似的"类型枚举" (虽然它们实际上隐藏在一些宏之后)。

2 个答案:

答案 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?