如何使C枚举类型可用于其他语言

How to make C enum types available to other languages?

本文关键字:用于 其他 语言 类型 何使 枚举      更新时间:2023-10-16

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

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

我的程序与各种其他语言(F77、F90、Python…)接口,我希望这些枚举类型在C/C++头文件中定义一次,并在其他语言中使用它们。我希望避免为我所使用的每一种语言定义相同的"enum"类型(它们在其他语言中可能被不同地调用…),因为这将是一项非常容易出错的任务。有什么优雅的方法吗?

假设在所有语言中,您都将它们定义为逗号分隔的列表,您可能可以执行以下操作:

ENUMS.txt

POINT,
LINE,
AREA,
VOLUME

Myfile.h

typedef enum
{
#include "ENUMS.txt" 
} domainType;

在C/C++中,这是可行的。然而,我不知道你的其他语言是否也有类似的功能,比如C/C++中的include。如果是,那么你可以用这样的方式来做。

例如,我确信这在Java中是行不通的。

否则,您只能在一些配置文件中定义它们,并通过函数映射它们,但它们将不再是枚举。如果这个例子就是你的全部,那么它可能不值得付出努力,但如果你有数百个这样的名字,那么它也许是值得的。

更新

考虑到这一点后,可能会有其他方法,这可能会有一些工作,但可能会有用。对于像我上面展示的那样支持include的语言,这种方法很好。对于其他语言,如Java、Python等,您可以编写一个生成有效源文件的简单脚本。我为java做了类似的事情,根据从数据库中读取的定义,将数据库记录生成为类。如果您必须支持多种语言,和/或频繁修改枚举,这可能很有用,因为您仍有一个源代码需要维护。

采用Python的Devolus方法,您可以为枚举文本创建一个字典,如下所示:

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"访问您的枚举。

那是一种方式。我相信自从这个IS Python之后还有一百万。。。