Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python C中的枚举:可以对基础变量的值进行哪些假设?_Python_C_Enums - Fatal编程技术网

Python C中的枚举:可以对基础变量的值进行哪些假设?

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

我正在编写一些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>
};
//
//设备状态
//
枚举{
好的,
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=红葡萄酒