如何使C枚举类型可用于其他语言
How to make C enum types available to other languages?
我目前正在编写一个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之后还有一百万。。。
- 程序没有问 3 个问题,而是将我对第一个问题的回答用于其他两个问题
- 用于对项目进行分组并将单个项目映射到其他组成员的数据结构
- 将其他函数中的变量用于主函数C++
- 在Visual Studio中包括用于其他PC的库
- 在 Eclipse 中漂亮的打印C++适用于某些项目,而不适用于其他项目
- 在一个类中向向量添加元素不适用于其他类
- 访问void函数中的变量以用于其他函数?C++
- 现代C和C :可以将一个定义的结构用于其他声明的结构
- 如果您称为destructor并将分配的内存再次用于其他对象,会发生什么
- 如何使C枚举类型可用于其他语言
- 提取模板类中的类型以用于其他模板
- 函数模板可用于本地lambda,但不能用于其他函数
- Gradle C(本机)任务输出文件(用于其他任务/项目)
- ShellExecute 不适用于其他计算机
- C++-如何使显式导入的DLL函数可用于其他类
- 如何正确地将std::函数用于其他数据类型(在优先级队列中)
- 使动态初始化的变量可用于其他.cpp文件
- c++中的Curl_easy_perform会停止用于其他用途的计时器
- 将 main 中的变量值更改为可用于其他函数 (c++)
- 模板中的构造函数不同:一个用于字符串,另一个用于其他任何东西