Python C中的枚举:可以对基础变量的值进行哪些假设?
我正在编写一些python代码,通过python的Python C中的枚举:可以对基础变量的值进行哪些假设?,python,c,enums,Python,C,Enums,我正在编写一些python代码,通过python的ctypes模块调用C dll 有问题的DLL在其头文件中将一些返回值定义为enums: // // Device status // enum { FT_OK, FT_INVALID_HANDLE, FT_DEVICE_NOT_FOUND, FT_DEVICE_NOT_OPENED, FT_IO_ERROR, FT_INSUFFICIENT_RESOURCES, FT_INVALID_PA
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>
};
//
//设备状态
//
枚举{
好的,
FT\u无效的\u手柄,
未找到FT\u设备\u,
FT_设备未打开,
FT_IO_错误,
资源不足,
FT_参数无效,
};
我是从python接口的,所以我没有本机枚举。我是否可以假设枚举的内容从0
的值开始,每个项递增1?这很容易实现,但看起来我将依赖于编译器的实现细节
我已经对enum
变量的内部进行了一些挖掘,但是我找不到太多关于它们如何在内部工作的信息。仅提供有关如何在C/C#/which中使用它们的文档
我知道如果
enum
对各种变量都有常量定义,我可以依靠它,但在这种情况下,我正在与我无法访问的外部代码(仅dll)进行交互。您可以假设,enum可以设置一个数FT_OK=100,然后,后面的所有内容都将从此处递增。您可以假设,枚举可以设置一个数字FT_OK=100,然后后面的所有内容都将从此处递增。您是正确的
除非您专门为枚举
赋值,否则它将遵循以下规则:
- 第一个是零
- 后面的比前面的多一个
enum {
ZERO,
ONE,
SIX = 6,
SEVEN,
TWENTY = 20,
TWENTYONE
} someNumbers;
与您期望的完全一样,使用等于正确值的enum
常量
标准的控制部分(无论如何,对于C99)是6.7.2.2枚举说明符
:
带=的枚举数将其枚举常量定义为常量表达式的值。如果第一个枚举数没有=,则其枚举常量的值为0
每个no=的后续枚举数将其枚举常量定义为通过将1添加到前一个枚举常量的值而获得的常量表达式的值
你说得对
除非您专门为枚举
赋值,否则它将遵循以下规则:
- 第一个是零
- 后面的比前面的多一个
enum {
ZERO,
ONE,
SIX = 6,
SEVEN,
TWENTY = 20,
TWENTYONE
} someNumbers;
与您期望的完全一样,使用等于正确值的enum
常量
标准的控制部分(无论如何,对于C99)是6.7.2.2枚举说明符
:
带=的枚举数将其枚举常量定义为常量表达式的值。如果第一个枚举数没有=,则其枚举常量的值为0
每个no=的后续枚举数将其枚举常量定义为通过将1添加到前一个枚举常量的值而获得的常量表达式的值
6.7.2.2节
枚举说明符第3段中规定:
如果第一个枚举数没有=,则其枚举的值
常数为0。没有=的每个后续枚举数定义其
枚举常量作为获得的常量表达式的值
通过向上一个枚举常量的值添加1。(修订)
使用带有
=可能生成枚举常量,其值与同一枚举中的其他值重复。)枚举的枚举数为
也称为其成员
它还提供了一个示例来澄清:
enum hue { chartreuse, burgundy, claret=20, winedark };
并说:
枚举值位于集合{0,1,20,21}中
不清楚您是否关心底层类型,但第4段指出:
每个枚举类型应与char兼容,char是一个有符号整数
类型,或无符号整数类型。类型的选择很简单
实施定义,110),但应能够代表
枚举的所有成员的值。枚举类型为
直到终止枚举数列表的}之后才完成
声明
6.7.2.2节
枚举说明符第3段中规定:
如果第一个枚举数没有=,则其枚举的值
常数为0。没有=的每个后续枚举数定义其
枚举常量作为获得的常量表达式的值
通过向上一个枚举常量的值添加1。(修订)
使用带有
=可能生成枚举常量,其值与同一枚举中的其他值重复。)枚举的枚举数为
也称为其成员
它还提供了一个示例来澄清:
enum hue { chartreuse, burgundy, claret=20, winedark };
并说:
枚举值位于集合{0,1,20,21}中
不清楚您是否关心底层类型,但第4段指出:
每个枚举类型应与char兼容,char是一个有符号整数
类型,或无符号整数类型。类型的选择很简单
实施定义,110),但应能够代表
枚举的所有成员的值。枚举类型为
直到终止枚举数列表的}之后才完成
声明
C标准第6.7.2.2.1443节: 如果第一个枚举数没有=,则 其枚举常量的值为0 和6.7.2.2.1444: 每个后续枚举数都没有= 将其枚举常量定义为值 通过加法得到的常数表达式的 1到上一个枚举的值 不变的 此外,6.7.2.2.1450还有一个例子: 以下片段的示例: enum色调{黄绿色,勃艮第,红葡萄酒=20,葡萄酒暗色} 枚举色调列,*cp col=红葡萄酒