自动生成枚举查找表
Automating the generation of an enum lookup table
>我正在使用与此类似的技术来关联信息和/或与枚举器的操作。它运行良好,但有一个小问题,需要有效地列出每个常量两次,一次在枚举声明的头文件中,一次在查找表的源文件中。我想知道是否有任何好方法,可能是预处理器技巧(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),并不特别担心可移植性。
我在某个地方尝试过,但我扔掉了...我不记得为什么它不起作用。也许我可以在时间机器中找到它...
使用预处理器技巧,您可以在不同的文件中定义枚举(例如,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
属性表。
看看我的要点,寻找字符串枚举 https://gist.github.com/3058317
也许你应该编写自己的代码生成器,它采用一些带有名称和关联值的数据文件,并生成头文件和数据表,可能作为一个独立的C
模块。
这个程序编写起来很简单,但对于您使用来说非常强大。
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 标准::可选枚举的比较运算符
- C++两个源文件之间共享的枚举的静态实例
- 打印没有铸件的枚举可以在C++中吗?
- 枚举成员与静态 int 成员?
- C++:枚举:错误:应使用标识符而不是"}"
- 带有 c++ 的枚举(输入检查)
- 自动生成枚举查找表
- 使用 libclang 查找匿名枚举
- 在枚举的向量中查找