【问题标题】:What does this syntax in an initializer list in C mean?C 中初始化列表中的这种语法是什么意思?
【发布时间】:2017-10-07 23:41:50
【问题描述】:

我正在阅读某些操作系统的引导加载程序代码并想出了这样的语法:

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] = …

【问题讨论】:

    标签: c syntax initializer-list designated-initializer


    【解决方案1】:

    这是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】:

      这是什么意思? [0] = 什么?

      这是一个designated initializer。一个 C99 构造,允许您指定将使用 smth 初始化的数组元素。因此,不必依赖初始值设定项的位置来隐式匹配数组元素的位置。相反,初始化是明确的(而且 IMO 更好)。

      【讨论】:

        【解决方案3】:

        它被称为“指定初始化器”。这意味着以下初始化程序用于数组的第一个元素(索引 0)。在这种情况下,它是多余的,因为第一个初始化程序无论如何都会用于第一个元素。它在这里提供与第二个初始化程序的并行性,它以[KERNBASE&gt;&gt;PDXSHIFT] 作为指示符。

        初始化器作为一个整体为数组中的 2 个元素提供了一个初始值。数组的其余部分初始化为 0。

        【讨论】:

          猜你喜欢
          • 2020-07-17
          • 2021-08-16
          • 1970-01-01
          • 2010-12-09
          • 1970-01-01
          • 2016-03-30
          • 1970-01-01
          相关资源
          最近更新 更多