我正在使用类似于this的技术将相关信息和/或操作与枚举器联系起来。它工作得很好,但是有一个小问题需要有效地列出每个常量两次,一次在枚举声明的头文件中,一次在查找表的源文件中。我想知道是否有任何好方法,可能有预处理器技巧(Boost.Preprocessor是可接受的),“自动化”它,以便我可以在一个地方输入枚举常量和相关值等,并拥有所有必要的东西(或许即使是查找结构本身也会生成。
如果可能的话,我更喜欢一种保持模糊枚举式语法的方法;例如,DECLARE_ENUM(...) {E_CONST(...), E_CONST(...)};
之类的东西。我已经看到一些网站提到双重包含头文件的想法,以实现这一点,即这样的事情:
#include "my_enum.hpp"
#undef ENUM_HPP // undefine the include guard
#undef E_CONST
#define E_CONST(...) /* something here */
#include "my_enum.hpp"
......但我不确定这种技术会有多么有用。特别是,标题中定义的枚举不仅仅是枚举;查找表结构也在那里,还有一些其他相关的枚举和支持函数。
我已经使用宏来定义查找表中的元素(它使用C99初始值设定项,这样即使重新排列枚举常量的顺序,条目也总是在正确的位置)。
可以应用于多个枚举的解决方案也很不错。
我正在使用clang(Apple-3.1),并不特别担心便携性。
我曾在某个地方尝试过扔掉......我不记得为什么它不起作用。也许我可以在Time Machine中找到它......
答案 0 :(得分:2)
使用预处理器技巧,您可以在不同的文件中定义您的枚举(例如,enum_foo.def)。这将是一个无人看守的文件,获得#include
d。
ENUM_FOO_DEF(ALPHA, 9, 2)
ENUM_FOO_DEF(BETA, 10, 3)
ENUM_FOO_DEF(GAMMA, 12, 7)
ENUM_FOO_DEF(DELTA, 13, 11)
//...
然后在您的源文件中,您将执行以下操作:
enum FooEnum {
#define ENUM_FOO_DEF(X,Y,Z) FOO_E_ ## X,
#include "enum_foo.def"
#undef ENUM_FOO_DEF
FOO_E_MAX
};
您可以执行类似的操作来填充enum
属性表。
答案 1 :(得分:1)
请查看我的要点,找到字符串枚举https://gist.github.com/3058317
答案 2 :(得分:0)
也许您应该编写自己的代码生成器,它会获取一些带有名称和关联值的数据文件,并生成头文件和数据表,可能是一个独立的C
模块。
这个程序写起来很简单,但对你的使用非常有用。