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,那么为什么人们这样做呢?
虽然这不是语法上的必然,但程序员通常会插入零,以使枚举成员的语义对读者清楚.原因可能是枚举用作数组的索引,或者用作某些外部资源的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交叉引用来跟踪标识符的使用要容易得多.