为什么有时Linux内核中枚举的第一个成员用0初始化

时间:2018-01-10 13:42:29

标签: c linux enums linux-kernel

我在linux内核源代码中注意到,一些枚举定义的第一个枚举成员用0显式初始化,如下所示:

enum i2c_adapter_type {
    I2C_ADAPTER_SMBUS = 0,
    I2C_ADAPTER_VGADDC,
    I2C_ADAPTER_PANEL,
    I2C_ADAPTER_DESIGNWARE_0,
    I2C_ADAPTER_DESIGNWARE_1,
};

chromeos_laptop.c提供的代码段:56

https://github.com/torvalds/linux/blob/master/drivers/platform/chrome/chromeos_laptop.c

有人可以解释一下,做这样一个构造的目的是什么?我知道第一个枚举成员在后来的C标准(ANSI,C99等)中保证为0,那么为什么人们这样做呢?

1 个答案:

答案 0 :(得分:7)

虽然这不是语法必需,但程序员通常会插入零,以使读者明确枚举成员的语义。原因可能是枚举用作数组的索引,或者用作某些外部资源的ID。这是一个提示,更改枚举(删除,添加,重新排序)可能会产生影响,但额外的评论是一个好主意。在这种情况下,在第55行中它属于:

/* Keep this enum consistent with i2c_adapter_names */

此模式可以扩展为明确地为每个成员提供值,例如: G。如果条目在过时时被删除,并且你想因某些原因保留差距或绝对值,则可能会发生:

static const char *i2c_adapter_names[] = {
    "SMBus I801 adapter",
    "i915 gmbus vga",
    "<unsupported>",
    "Synopsys DesignWare I2C adapter",
    "Synopsys DesignWare I2C adapter",
};

enum i2c_adapter_type {
    I2C_ADAPTER_SMBUS = 0,
    I2C_ADAPTER_VGADDC = 1,
    /*I2C_ADAPTER_PANEL = 2,*/
    I2C_ADAPTER_DESIGNWARE_0 = 3,
    I2C_ADAPTER_DESIGNWARE_1 = 4,
};

加成

对于UNPROBED及其i2c_peripheral_state中的兄弟姐妹,这也有一个特殊含义:enum用于struct i2c_peripheral,0是你使用{时的默认值{1}}(由于可能的副作用,我不是它的粉丝)或者初始化结构的初始化列表(应该是首选)。因此,当没有明确地分配其他值时,状态memset(…, 0, sizeof(…))是默认值,这可以在分配了该结构的实例的几个地方看到,例如, G。 line 429

作为奖励的原型:使用Linux cross reference跟踪标识符的使用要容易得多。