如何使C enum类型可用于其他语言?

时间:2014-01-10 13:10:55

标签: python c++ c fortran

我目前正在编写一个C / C ++程序,它使用头文件中的一堆enum,比如说

typedef enum
{
    POINT,
    LINE,
    AREA,
    VOLUME
} domainType;

我的程序与各种其他语言(F77,F90,Python,...)接口,我想要在C / C ++头文件中定义这些枚举类型,并在其他语言中使用它们。我想避免为我正在接口的每种语言定义相同的“enum”类型(它们可能在其他语言中被称为不同......),因为这将是一个非常容易出错的任务。有一些优雅的方法怎么做?

2 个答案:

答案 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以来还有一百万......