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.