我正在阅读某些操作系统的bootloader代码,并想出了这样的语法:
pde_t entry_pgdir[NPDENTRIES] = {
// Map VA's [0, 4MB) to PA's [0, 4MB)
[0]
= ((uintptr_t)entry_pgtable - KERNBASE) + PTE_P,
// Map VA's [KERNBASE, KERNBASE+4MB) to PA's [0, 4MB)
[KERNBASE>>PDXSHIFT]
= ((uintptr_t)entry_pgtable - KERNBASE) + PTE_P + PTE_W
};
这是什么意思 - [0] = …
?
答案 0 :(得分:2)
这是什么意思? [0] = smth?
这是一个designated initializer。一个C99构造,允许您指定将使用smth
初始化的数组元素。因此,不必依赖于初始化器的位置来隐式地匹配数组元素的位置。相反,初始化是明确的(和IMO更好)。
答案 1 :(得分:2)
这是C99 array initialization syntax(又名'指定初始值设定项')。它允许您混合常规值,例如
pde_t entry_pgdir[NPDENTRIES] = {val1, val2}
使用[ind1] = val1, [ind2] = val2
语法。这样的语义是方括号中的值被解释为索引,而=
之后的值被解释为要存储在相应索引处的值。
其余条目归零。如果您在索引值之后放置常规值,则编号将继续index+1
。
当数据存在间隙时,此语法很方便,例如
int logval[] = {
[1<<0] = 1
, [1<<1] = 2
, [1<<2] = 3
, [1<<3] = 4
...
};
这比简单的等价物更容易阅读:
int logval[] = {0, 1, 2, 0, 3, 0, 0, 0, 4, ...}
答案 2 :(得分:1)
它被称为“指定初始化程序”。这意味着以下初始化程序用于数组的第一个元素(索引0)。在这种情况下,它是多余的,因为第一个初始化器无论如何都是第一个元素。这里提供与第二个初始化器的并行性,第二个初始化器具有[KERNBASE>>PDXSHIFT]
作为指示符。
初始化程序整体为2个数组元素提供初始值。数组的其余部分初始化为0。