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

Laz*_*eus 2 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,
};
Run Code Online (Sandbox Code Playgroud)

chromeos_laptop.c提供的代码片段:56

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

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

Mur*_*phy 7

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

/* Keep this enum consistent with i2c_adapter_names */
Run Code Online (Sandbox Code Playgroud)

此模式可以扩展为明确地为每个成员提供值,例如,如果条目在过时时被删除,并且您希望由于某种原因保留间隙或绝对值:

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,
};
Run Code Online (Sandbox Code Playgroud)

加成

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

作为奖励的原型:使用Linux交叉引用来跟踪标识符的使用要容易得多.