2014-01-07 29 views
3

我有一些C代码,转载如下。我的理解是它将BootPML4数组的某些位设置为某个值。有人可以解释如何填充下面的BootPML4阵列吗?另外,如何确保数组中未使用的值为零,同时确保下面的两个设置保持不变?清零不寻常的阵列

typedef uint64_t pml4_entry_t; 
#define PML4_PROT (INTEL_PTE_VALID | INTEL_PTE_WRITE) 
pml4_entry_t BootPML4[PTE_PER_PAGE] __attribute__((section("__HIB, __bootPT"))) = { 
    [0]     = ((uint64_t)(PAGE_SIZE) | PML4_PROT), 
    [KERNEL_PML4_INDEX] = ((uint64_t)(PAGE_SIZE) | PML4_PROT), 
}; 

回答

3

这是使用指定初始化这是在C99补充说,在段C99 draft标准的正向部分说:

[...]主要以前版本的变化包括:

并具有以下子弹:

- 指定初始化

和细节将在第6.7.8初始化和段落提供了以下示例和:

示例12空间可以从一个“两端分配”阵列通过使用单个指示符:

int a[MAX] = { 
    1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0 
}; 

在上文中,如果MAX是大于10,就会出现在中间的一些零值元素;如果它小于10,那么前五个初始值设定项提供的某些值将被第二个5设定值覆盖。

gcc doc指定初始化具有更好的例子:

要指定的数组索引,写“[索引] =”元素值之前。例如,

int a [6] = {[4] = 29,[2] = 15};

相当于

INT一个[6] = {0,0,15,0,29,0};

即使被初始化的数组是自动的,索引值也必须是常量表达式。

+0

这不是gcc扩展。这是1999年ISO标准的标准C功能。 (好吧,我认为这是一个扩展,如果你正在编译前C99模式。) –

+0

@KeithThompson是的,没有使用它自己,我意识到,再次阅读介绍后,正在寻找一个标准的例子。 –

+0

你的回答仍然表示这是一个扩展。我认为它是C语言的一个标准功能更有意义。 –