我在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,那么为什么人们这样做呢?
答案 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跟踪标识符的使用要容易得多。