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 :(得分:2)
在C
中,EXMPL 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 :(得分:1)
当然,你得到的初始化程序错误太多了。您使用的初始化程序太多了。工会在任何时候都只拥有其中一名成员。不是两个,不是三个,不是九个。
你也应该选择一种语言。从长远来看,C和C ++并不相同。工会在大多数C ++程序中几乎没有地位。直到最近,关于他们能够持有什么的规则发生了变化,他们几乎没用了,但是在你真正想要或需要工会的情况下,情况仍然很少。
答案 2 :(得分:1)
您不能直接将外部结构设置为其中一个联合成员。 您应该在 EXMPL 中设置联合的一个成员。
作为参考,请遵循这个简单的例子。
说我有这个结构定义:
struct unionExample {
union{
int integerInUnion;
long longInUnion;
}
}
如果要将union成员设置为int,则必须将其设置为:
struct unionExample union_example;
union_example.integerInUnion = 5;
只是为了纠正你的错误,你试图像这样设置联盟成员:
union_example = 5
当然你不能这样做,因为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 }};
答案 3 :(得分:1)
有人可以评论指定初始值设定项的可移植性吗?在我看来,这比许多嵌套括号更清晰。
y
更不用说这允许在需要时直接初始化A和B.