从共享库获取枚举定义

5 投票
2 回答
1568 浏览
提问于 2025-04-16 18:53

我正在使用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'。所以我的问题是:

  1. 是否可以从共享库中提取枚举定义的数值,还是说编译器处理完后,整个枚举的概念就“消失”了?
  2. 如果枚举值确实存在于共享库中,我该如何从Python/ctypes访问它们?

2 个回答

0

可以去看看MSDN上关于枚举(enums)的好处:它说枚举是一个替代方案,可以用来代替#定义(#define)这种预处理指令。枚举的好处在于,它的值可以自动生成,并且遵循正常的作用域规则。不过,枚举缺少类型安全这一点是比较明显的。这就意味着,正如你所说的,枚举在编译后可能就不再被重视了。

5

枚举的定义不会被导出,所以你现在的解决方案就是唯一可用的。

总的来说,C语言中的枚举值其实就是一些整数常量。在C语言中,枚举没有类型安全,你可以把任何整数值传给枚举参数。所以说,C编译器在这方面并没有做太多的限制。

撰写回答