我目前正在编写一个C / C ++程序,它使用头文件中的一堆enum
,比如说
typedef enum
{
POINT,
LINE,
AREA,
VOLUME
} domainType;
我的程序与各种其他语言(F77,F90,Python,...)接口,我想要在C / C ++头文件中定义这些枚举类型,并在其他语言中使用它们。我想避免为我正在接口的每种语言定义相同的“enum
”类型(它们可能在其他语言中被称为不同......),因为这将是一个非常容易出错的任务。有一些优雅的方法怎么做?
答案 0 :(得分:2)
假设您在所有语言中将它们定义为以逗号分隔的列表,您可以执行以下操作:
<强> ENUMS.txt 强>
POINT,
LINE,
AREA,
VOLUME
<强> Myfile.h 强>
typedef enum
{
#include "ENUMS.txt"
} domainType;
在C / C ++中,这可行。但是,我不知道您的其他语言是否具有类似C / C ++中包含的功能。如果是,那么你可以这样做。
我很确定这在Java中不起作用。
否则你只能在一些配置文件中定义它们并通过函数映射它们,但是它们不再是枚举。如果这个例子就是你所拥有的,那么它的可能性是不值得的,但如果你有数百个这样的名字,那么它可能是值得的。
<强>更新强>
在考虑了这个之后,可能会有一些其他的方法,这将是一些工作,但可能是有用的。对于支持像我上面所示的包含的语言,这种方法很好。对于其他语言,如Java,Python等,您可以编写一个生成有效源文件的简单脚本。我正在为java做类似的事情,根据从数据库中读取的定义,将数据库记录生成为类。 如果您必须支持多种语言,和/或经常修改枚举,这可能很有用,因为您仍然需要维护一个源。
答案 1 :(得分:1)
采用Devolus方法进行Python,您可以为这样的枚举文字创建一个字典:
with open('ENUMS.txt', 'r') as f:
content = f.read().splitlines()
domainType = {}
index = 1
for enum_literal in content:
enum_literal = enum_literal.strip() # remove any whitespace
enum_literal = enum_literal.rstrip(',') # remove comma
print 'Adding ' + enum_literal + ' to dict'
domainType [enum_literal] = index
index = index + 1
然后您可以使用'domainType'来访问您的枚举。
这是一种方式。我确信自从这是Python以来还有一百万......