2014-01-07 55 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語言的一個標準功能更有意義。 –