我正在编写一些python代码,通过python' ctypes
模块调用C dll。
有问题的DLL将一些返回值定义为enum
s的头文件:
//
// Device status
//
enum {
FT_OK,
FT_INVALID_HANDLE,
FT_DEVICE_NOT_FOUND,
FT_DEVICE_NOT_OPENED,
FT_IO_ERROR,
FT_INSUFFICIENT_RESOURCES,
FT_INVALID_PARAMETER,
<continued---snip>
};
我从python接口,所以我没有本地枚举。我可以假设枚举的内容从0
开始,每个项目增加1吗?这很容易实现,但似乎我依赖于编译器的实现细节。
我已经对enum
变量的内部进行了一些挖掘,但在内部我找不到太多关于它们是如何工作的。只有关于如何在C / C#/中使用它们的文档。
我知道enum
是否对各种变量有不变的定义,我可以依靠它,但在这种情况下,我可以与我无法访问的外部代码连接到(只是dll)。
答案 0 :(得分:3)
你是对的。
除非您专门为enum
分配值,否则它遵循以下规则:
例如:
enum {
ZERO,
ONE,
SIX = 6,
SEVEN,
TWENTY = 20,
TWENTYONE
} someNumbers;
正如您所期望的那样完全,enum
常量等于正确的值。
标准的控制部分(无论如何,对于C99)是6.7.2.2 Enumeration specifiers
:
带枚举的枚举器将其枚举常量定义为常量表达式的值。如果第一个枚举数没有=,则其枚举常量的值为0.
每个后续的带有no的枚举器将其枚举常量定义为通过将1加到前一个枚举常量的值而获得的常量表达式的值。
答案 1 :(得分:3)
6.7.2.2
枚举说明符段 3 中的draft C99 standard说:
如果第一个枚举器没有=,则枚举的值为 常量为0.每个后续的枚举器都没有=来定义它 枚举常量作为获得的常量表达式的值 通过将1添加到先前枚举常量的值。 (该 使用枚举器 =可以生成枚举常量,其值与同一枚举中的其他值重复。)枚举的枚举数是 也被称为其成员。
它还提供了一个澄清的例子:
enum hue { chartreuse, burgundy, claret=20, winedark };
并说:
枚举值位于集合{0,1,20,21}中。
目前尚不清楚您是否关注基础类型,但段落 4 表示:
每个枚举类型应与char(一个有符号整数)兼容 类型或无符号整数类型。类型的选择是 实现定义的,110)但应能够代表 枚举的所有成员的值。枚举类型是 不完整,直到}终止枚举器列表 声明。
答案 2 :(得分:1)
C标准,第6.7.2.2.1443节:
如果第一个枚举器没有=,那么 其枚举常数的值为0.
和6.7.2.2.1444:
每个后续的枚举器没有= 将其枚举常量定义为值 通过添加获得的常量表达式 1到前一个枚举的值 恒定。
另外,6.7.2.2.1450有一个例子:
示例以下片段:
enum hue {chartreuse,burgundy,claret = 20,winedark};
enum hue col,* cp;
col = claret;
cp =&amp; COL;
if(* cp!= burgundy)
/ * ... * /
使hue成为枚举的标记,并且 然后将col声明为具有该对象的对象 type和cp作为指向具有的对象的指针 那种类型。枚举值在 设置{0,1,20,21}。
答案 3 :(得分:0)
你可以假设,枚举可以设置一个数字FT_OK = 100,然后一切都会从那里增加。