C++ 自动生成枚举查找表

C++ 自动生成枚举查找表,c++,enums,c-preprocessor,C++,Enums,C Preprocessor,我正在使用一种类似于与枚举数关联的信息和/或操作的技术。它工作得很好,但有一个小问题,需要有效地列出每个常量两次,一次在枚举声明的头文件中,一次在查找表的源文件中。我想知道是否有什么好的方法,可能是使用预处理器技巧(Boost.preprocessor是可以接受的),来“自动化”它,这样我就可以在一个地方输入枚举常量和相关值等,并生成所有必要的内容(甚至可能是查找结构本身) 如果可能的话,我更喜欢一种维护模糊枚举风格语法的方法;例如,DECLARE_ENUM(…){E_CONST(…),E_CO

我正在使用一种类似于与枚举数关联的信息和/或操作的技术。它工作得很好,但有一个小问题,需要有效地列出每个常量两次,一次在枚举声明的头文件中,一次在查找表的源文件中。我想知道是否有什么好的方法,可能是使用预处理器技巧(Boost.preprocessor是可以接受的),来“自动化”它,这样我就可以在一个地方输入枚举常量和相关值等,并生成所有必要的内容(甚至可能是查找结构本身)

如果可能的话,我更喜欢一种维护模糊枚举风格语法的方法;例如,
DECLARE_ENUM(…){E_CONST(…),E_CONST(…)}。我看到一些网站提到为了实现这一点而将头文件包含在double中的想法,例如:

#包括“my_enum.hpp”
#取消定义ENUM_水电站//取消定义包含保护
#未定义E_常数
#在这里定义E_CONST(…)/*某物*/
#包括“my_enum.hpp”
…但我不确定这项技术在这里有多有用。特别是,头中定义的枚举不止一个;查找表结构也在那里,还有一些其他相关的枚举和支持函数

我已经在使用宏定义查找表中的元素(它使用C99初始值设定项,这样即使我重新排列枚举常量的顺序,条目也将始终位于正确的位置)

可以应用于多个枚举的解决方案也不错

为此我使用了clang(Apple-3.1),并不特别担心便携性


我在某个地方做了一次尝试,我把它扔掉了。。。我不记得为什么它不起作用了。也许我可以在Time Machine中找到它…

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


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

使用预处理器技巧,您可以在不同的文件(例如,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
属性表。

看看我关于字符串枚举的要点

建议不要只放一个简单的链接,因为链接本身就是一个概念:它相当繁重,有点扼杀了枚举是编译时常量且不包含任何运行时开销的想法。您还可以使用一些预处理技巧来更好地避免重复宏名称。我认为在这种特殊情况下,这比我需要的要多一些,尽管这是需要记住的。@Matthieu M:我知道这种想法有缺点,但可以改进。在重复链接中可能存在重复,我发布了一个答案,使用Boost.Preprocessor生成枚举到字符串的转换(它也可以扩展为字符串到枚举)。另一个问题更集中于外部脚本和代码生成:谢谢,我将看看我能从这两个问题中得到什么想法。(事实上,我记得我以前见过第二个,我想。)可能是No的重复,这个问题不是把enum的名称作为字符串;这是关于减少定义允许以字符串形式获取枚举名称的构造过程中固有的代码重复。大概我会考虑一下这个想法。也许我可以在Boost.Preprocessor中使用一些东西,让它看起来更好一些。