c - 从枚举中删除一个值而不更改其他值

标签 c enums refactoring c-preprocessor

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

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

枚举值在代码中用于指定对象类型,并作为数据文件的一部分写入磁盘。这在大多数情况下都很好用,但有一个缺点:

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

有什么好的技术可以避免这个问题吗?也许一些预处理器技巧?

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

注:本题来自Navit的源码,它使用了几个这样的“类型枚举”(尽管它们实际上隐藏在一些宏后面)。

最佳答案

如果你很少想删除项目,你可以做类似的事情

enum item_type {
  street,
  town,
  //lake,
  border = town+2,
...
}

即仅明确地为紧跟在您删除的项目之后的项目分配一个值。

既然兼容性对你来说很重要,那么硬着头皮给所有项目明确编号会更可靠

enum item_type {
  street = 0,
  town   = 1,
  //lake   = 2,
  border = 3,
...
}

关于c - 从枚举中删除一个值而不更改其他值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24046840/

相关文章:

c - 链表显示额外的零项

java - 我可以使用 EL 从 JSP 访问枚举类的值吗?

c - 在为所有枚举值定义大小写后,编译器仍然说 : "control reaches end of non-void function"

html - 重构 CSS 以消除 "magic numbers"

c# - 如何重构这些重载的类构造函数? (C#)

c++ - 如何使用显存作为标准内存存储?

c - 使用 strtok 替换输入文件 C 中的部分字符串

c - 我怎样才能把我的文字涂成橙色?

java - 是否可以以兼容的方式更改可序列化类的某些字段的类型?

ruby - 用代码包围 Ruby 方法