C中初始化列表中的这种语法是什么意思?

时间:2017-10-07 23:41:51

标签: c syntax initializer-list designated-initializer

我正在阅读某些操作系统的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] = …

3 个答案:

答案 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。