C中的枚举:可以对基础变量的值做出哪些假设?

时间:2014-07-25 01:37:10

标签: python c enums

我正在编写一些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)。

4 个答案:

答案 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}。

链接:The New C Standard: 6.7.2.2

答案 3 :(得分:0)

你可以假设,枚举可以设置一个数字FT_OK = 100,然后一切都会从那里增加。