从共享库获取枚举定义
我正在使用ctypes来访问一个用C语言写的共享库。这个共享库的C源代码里有一个枚举类型,像这样:
enum {
invalid = 0,
type1 = 1,
type2 = 2
} type_enum;
在Python这边,我打算为不同的枚举值定义一些整数常量,比如:
INVALID = 0
TYPE1 = 1
TYPE2 = 2
然后在调用C函数的Python代码中使用这些数字“常量”。这样做似乎没问题,不过我非常希望能直接从共享库中获取枚举的数值(是不是可以称为自省?);但是用比如nm命令查看共享库时,似乎没有找到任何符号,比如'invalid'、'type1'或'type2'。所以我的问题是:
- 是否可以从共享库中提取枚举定义的数值,还是说编译器处理完后,整个枚举的概念就“消失”了?
- 如果枚举值确实存在于共享库中,我该如何从Python/ctypes访问它们?
2 个回答
0
可以去看看MSDN上关于枚举(enums)的好处:它说枚举是一个替代方案,可以用来代替#定义(#define)这种预处理指令。枚举的好处在于,它的值可以自动生成,并且遵循正常的作用域规则。不过,枚举缺少类型安全这一点是比较明显的。这就意味着,正如你所说的,枚举在编译后可能就不再被重视了。
5
枚举的定义不会被导出,所以你现在的解决方案就是唯一可用的。
总的来说,C语言中的枚举值其实就是一些整数常量。在C语言中,枚举没有类型安全,你可以把任何整数值传给枚举参数。所以说,C编译器在这方面并没有做太多的限制。