2012-03-15 62 views
1

我正在瀏覽一個名爲OVP公司(類似於qemu的產品)提供的「處理器建模指南」。在這裏面,有一個小的代碼片斷類似如下:不熟悉的語法初始化數組/結構,尋找解釋

static or1kDispatchTableC dispatchTable = { 
    // handle arithmetic instructions 
    [OR1K_IT_ADDI] = disDefault, 
    [OR1K_IT_ADDIC] = disDefault, 
    [OR1K_IT_ANDI] = disDefault, 
    [OR1K_IT_ORI] = disDefault, 
    [OR1K_IT_XORI] = disDefault, 
    [OR1K_IT_MULI] = disDefault 
}; 

我以前從未見過的語法是這樣的。 無關C++的東西刪除

目前我沒有能力下載/看看他們的東西,看看如何定義任何東西,因此我的問題。如果你認識到這個語法,你可以稱重嗎?


編輯

or1kDispatchTableCor1kDispatchTableCP類型的指針的類型定義,但我還是沒有什麼or1kDispatchTableCP是什麼。

+1

C++在過去幾年中發生了比我想象的更大的變化(很有可能),或者有人對[]運算符做了一些奇怪的重新定義。我開始深入研究那個or1kDispatchTableC的構造函數/賦值運算符定義,然後找出它想要做的是什麼。但是,從來沒有見過。 – 2012-03-15 22:52:23

+0

可能要等待直到我可以訪問他們的標題才能得到完整的答案。 – 2012-03-15 22:55:46

+1

[]運算符爲什麼?沒有左手邊。 – 2012-03-15 23:06:01

回答

5

好吧,假設你的第一行是一個錯字,或者or1kDispatchTableC是一個數組類型,所以這實際上是一個數組聲明,這看起來像一個C11明確初始化的數組。行

[OR1K_IT_ADDI] = disDefault, 

初始化元件OR1K_IT_ADDIdisDefault。這兩個都需要是常量表達式 - OR1K_IT_ADDI可能是#define或枚舉標記。

我很確定C++ 11不支持這種語法,儘管一些編譯器(也支持C11)可能支持它作爲擴展。

從名字我猜想,這實際上是一個函數指針數組。

+1

這裏的「C11」可能看起來像只從C11開始才支持。但是從C99開始,指定的初始化器是有效的。 – 2012-03-18 14:02:37

+0

謝謝,就是這樣。作爲參考,以下是GCC文檔:http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits。html – 2012-03-19 17:37:03

2

這稱爲指定的初始化程序並且是C特徵(自C99起支持)。它允許直接尋址數組和結構/聯合元素,用缺省值填補缺口。

struct foo { int a[10]; }; 
struct foo f[] = { [5].a[3] = 20 }; 

現在,這導致在struct foo5元素,全部初始化爲0,隨後的struct foo第六元素與初始化爲20

像別人懷疑a 4元,這是不支持由C++。

+0

謝謝你的例子,你是對的;它甚至沒有作爲g ++的擴展來實現。 – 2012-03-19 17:39:12