2016-04-28 197 views
0
struct EXMPL 
{ 
    union 
    { 
    struct 
    { 
     struct 
     { 
     uint8_t AA; 
     uint8_t BB; 
     uint8_t CC; 
     uint8_t DD; 
     }Rev; 

     struct 
     { 
     uint8_t XX; 
     uint8_t VV; 
     uint8_t WW; 
     uint8_t FF; 
     }IDs; 
    }; 

    struct UNN 
    { 
     uint32_t A; 
     uint32_t B; 
    }; 
    }; 
}; 

的工會當我嘗試初始化這個像這樣:初始化結構

EXMPL aStruct = {{ 0x00, 0x00, 0x01, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }}; 

我得到一個「太多的初始值」的錯誤。任何幫助將非常感謝,謝謝。

+0

你想要初始化哪個工會的成員?一次只能使用一個。 – user4581301

+0

代碼中沒有'union','UNN'和匿名'struct'的實例。什麼是初始化? – LogicStuff

+1

C或C++,它不能同時存在。特別是在C語言中,您需要使用'typedef'來將結構名稱用作類型,但在C++中不需要。 – Barmar

回答

2

CEXMPL aStruct = {{...需要爲struct EXMPL aStruct = {{...

2級的{{不見了 - 加入

int main(void) { 
    struct EXMPL // level 1 
    { 
    union // level 2 
    { 
     struct // level 3 
     { 
     struct // level 4 
     { 
      uint8_t AA; 
      uint8_t BB; 
      uint8_t CC; 
      uint8_t DD; 
     }Rev; 

     struct 
     { 
      uint8_t XX; 
      uint8_t VV; 
      uint8_t WW; 
      uint8_t FF; 
     }IDs; 
     } ; 

     // level 3 
     // but irrelevant to initialization as only 1st union member counts by default 
     struct UNN 
     { 
     uint32_t A; 
     uint32_t B; 
     } ; 
    }; 
    }; 

    struct EXMPL aStruct = {{{{ 0x00, 0x00, 0x01, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }}}}; 
    ... 
+1

附加獎金,一旦C++的命名需求得到解決,這將工作(猜猜是什麼?)C++。 – user4581301

1

當然,你會得到太多的初始化錯誤。您正在使用太多的初始化程序。一個工會在任何時候都只有一個成員。不是兩個,而是三個,不是九個。

您還應該選擇一種語言。 C和C++不是一回事。在大多數C++程序中,工會幾乎沒有地位。直到最近,當他們可以持有的規則發生變化時,他們幾乎沒有任何用處,但當你真正需要或需要工會時,仍然很少有案例。

0

不能將外部結構直接設置爲聯合成員之一。 您應該在EXMPL內設置工會的成員之一。

作爲參考請按照這個簡單的例子。

說我有這個結構的定義:如果您想給聯盟成員設置爲一個int

struct unionExample { 
     union{  
     int integerInUnion; 
     long longInUnion; 
     } 
    } 

,你必須將其設置是這樣的:

struct unionExample union_example;   
union_example.integerInUnion = 5; 

只是爲了糾正你的錯誤是,你試圖設置聯盟成員是這樣的:

union_example = 5 

當然你不能這樣做,罪ce union_example的類型是unionExample,而不是int。

回到您發佈的示例,您需要命名聯合中的第一個結構。我會命名它XYZ。因此,代碼如下所示:

struct EXMPL 
{ 
    union 
    { 
    struct XYZ 
    { 
     struct 
     { 
     uint8_t AA; 
     uint8_t BB; 
     uint8_t CC; 
     uint8_t DD; 
     }Rev; 

     struct 
     { 
     uint8_t XX; 
     uint8_t VV; 
     uint8_t WW; 
     uint8_t FF; 
     }IDs; 
    }; 

    struct UNN 
    { 
     uint32_t A; 
     uint32_t B; 
    }; 
    }; 
}; 

現在,您應設置值XYZ像這樣:

EXMPL aStruct; 
aStruct.XYZ = {{ 0x00, 0x00, 0x01, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }}; 
+0

對另一個問題的完整答案。我時時刻刻對自己感到愧疚,所以沒有失望,但你是否編譯過這個? – user4581301

+0

不,我沒有時間編譯,但我只是想概述在這種情況下的問題。 –

+0

問題是OP想要一個靜態初始化。你的答案使用任務。編譯問題是'aStruct.XYZ',表示'aStruct'有一個名爲'XYZ'的成員,但它沒有。它有一個名爲'XYZ'的結構,但沒有提供該成員的名稱。在C++中不是猶太教,但是在C中,'XYZ'存在於命名方程之外的事實,您可以訪問'aStruct.Rev'和'aStruct.IDs'。 – user4581301

0

有人可以評論指定的初始化程序的可移植性嗎?在我看來,這比任何嵌套的括號更清晰。

struct EXMPL aStruct = { 
    .Rev = { 0xAB, 0xCD, 0xEF, 0x00 }, 
    .IDs = { 0x01, 0x10, 0x11, 0x00 } 
}; 

更不用說,如果需要,這可以直接初始化A和B.