2016-04-28 198 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.