C中初始化列表中的这个语法是什么意思?
What does this syntax in an initializer list in C mean?
我正在阅读一些 OS 的引导加载程序代码并想出了这样的语法:
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] = …
?
what does it mean? [0] = smth?
这是一个designated initializer。一种 C99 构造,允许您指定将使用 smth
初始化的数组元素。因此,不必依赖初始化程序的位置来隐式匹配数组元素的位置。相反,初始化是明确的(IMO 更好)。
这是 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, ...}
它被称为"designated initializer"。这意味着以下初始化程序是针对数组的第一个元素(索引 0)的。在这种情况下,它是多余的,因为无论如何第一个初始化器都是针对第一个元素的。它在这里提供与第二个初始化程序的并行性,它以 [KERNBASE>>PDXSHIFT]
作为指示符。
整个初始化器为数组中的 2 个元素提供初始值。数组的其余部分初始化为 0.
我正在阅读一些 OS 的引导加载程序代码并想出了这样的语法:
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] = …
?
what does it mean? [0] = smth?
这是一个designated initializer。一种 C99 构造,允许您指定将使用 smth
初始化的数组元素。因此,不必依赖初始化程序的位置来隐式匹配数组元素的位置。相反,初始化是明确的(IMO 更好)。
这是 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, ...}
它被称为"designated initializer"。这意味着以下初始化程序是针对数组的第一个元素(索引 0)的。在这种情况下,它是多余的,因为无论如何第一个初始化器都是针对第一个元素的。它在这里提供与第二个初始化程序的并行性,它以 [KERNBASE>>PDXSHIFT]
作为指示符。
整个初始化器为数组中的 2 个元素提供初始值。数组的其余部分初始化为 0.