2

我正在使用与此类似的技术与枚举器关联信息和/或操作。它工作得很好,但是有一个小问题需要有效地列出每个常量两次,一次在枚举声明的头文件中,一次在查找表的源文件中。我想知道是否有任何好方法,可能使用预处理器技巧(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),并不特别担心可移植性。

我在某个地方尝试过,但我扔掉了……我不记得为什么它不起作用。也许我可以在时间机器中找到它...

4

3 回答 3

2

使用预处理器技巧,您可以在不同的文件(例如 enum_foo.def)中定义枚举。这将是一个不受保护的文件,得到#included。

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属性表。

于 2012-07-06T05:24:25.253 回答
1

查看我的字符串枚举要点https://gist.github.com/3058317

于 2012-07-06T05:58:25.890 回答
0

也许您应该编写自己的代码生成器,它获取一些带有名称和关联值的数据文件,并生成头文件和数据表,可能作为独立C模块。

这个程序编写起来很简单,但对您的使用来说非常强大。

于 2012-07-06T05:06:18.820 回答