C++ 初始化结构的并集
当我尝试这样初始化时:C++ 初始化结构的并集,c++,c,C++,C,当我尝试这样初始化时: 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
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;
};
};
};
我得到一个“初始化值太多”错误。非常感谢您的帮助,谢谢 当然你会遇到太多的初始化错误。您使用的初始值设定项太多。一个工会在任何时候只拥有一个会员。不是两个,不是三个,不是九个
你也应该选择一种语言。C和C++是不一样的远景。在大多数C++程序中,工会几乎没有什么地位。直到最近,当关于他们可以持有什么的规则发生变化时,他们几乎没有用处,但仍然有少数情况下你真的想要或需要一个联盟。当然,你会遇到太多的初始值设定者。您使用的初始值设定项太多。一个工会在任何时候只拥有一个会员。不是两个,不是三个,不是九个
你也应该选择一种语言。C和C++是不一样的远景。在大多数C++程序中,工会几乎没有什么地位。直到最近,关于它们所能容纳的内容的规则发生了变化,它们才几乎没有用处,但仍然有少数情况下您真正想要或需要一个联合。您不能直接将外部结构设置为一个联合成员。 您应该在EXMPL中设置联盟的一个成员 作为参考,请遵循这个简单的示例 假设我有这个结构定义:
EXMPL aStruct = {{ 0x00, 0x00, 0x01, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }};
如果要将union成员设置为int,则必须如下所示:
struct unionExample {
union{
int integerInUnion;
long longInUnion;
}
}
struct unionExample union_example;
union_example.integerInUnion = 5;
union_example = 5
为了纠正您的错误,您正在尝试如下设置工会成员:
struct unionExample {
union{
int integerInUnion;
long longInUnion;
}
}
struct unionExample union_example;
union_example.integerInUnion = 5;
union_example = 5
当然你不能这么做,因为union_示例的类型是unionExample而不是int
回到您发布的示例,您需要命名联合体中的第一个结构。我将把它命名为XYZ。因此,代码将如下所示:
struct unionExample {
union{
int integerInUnion;
long longInUnion;
}
}
struct unionExample union_example;
union_example.integerInUnion = 5;
union_example = 5
现在,您应设置XYZ的值,如下所示:
不能直接将外部结构设置为联合成员之一。 您应该在EXMPL中设置联盟的一个成员 作为参考,请遵循这个简单的示例 假设我有这个结构定义:
EXMPL aStruct = {{ 0x00, 0x00, 0x01, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }};
如果要将union成员设置为int,则必须如下所示:
struct unionExample {
union{
int integerInUnion;
long longInUnion;
}
}
struct unionExample union_example;
union_example.integerInUnion = 5;
union_example = 5
为了纠正您的错误,您正在尝试如下设置工会成员:
struct unionExample {
union{
int integerInUnion;
long longInUnion;
}
}
struct unionExample union_example;
union_example.integerInUnion = 5;
union_example = 5
当然你不能这么做,因为union_示例的类型是unionExample而不是int
回到您发布的示例,您需要命名联合体中的第一个结构。我将把它命名为XYZ。因此,代码将如下所示:
struct unionExample {
union{
int integerInUnion;
long longInUnion;
}
}
struct unionExample union_example;
union_example.integerInUnion = 5;
union_example = 5
现在,您应设置XYZ的值,如下所示:
在
C
中,EXMPL-aStruct={{…
需要是struct-EXMPL-aStruct={…
2级{
缺失-添加
EXMPL aStruct;
aStruct.XYZ = {{ 0x00, 0x00, 0x01, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }};
在
C
中,EXMPL-aStruct={{…
需要是struct-EXMPL-aStruct={…
2级{
缺失-添加
EXMPL aStruct;
aStruct.XYZ = {{ 0x00, 0x00, 0x01, 0x00 }, { 0x00, 0x00, 0x00, 0x00 }};
有人能评论一下指定初始值设定项的可移植性吗?在我看来,这比嵌套的括号要清楚得多
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 }}}};
...
更不用说,如果需要的话,这允许直接初始化A和B。有人能评论一下指定初始化器的可移植性吗?在我看来,这比嵌套的括号要清楚得多
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 }}}};
...
如果你想要的话,可以直接初始化A和B。< / P>你想初始化哪个联盟成员?你只能一次使用一个。在代码中没有“代码>联盟联合<代码>,<代码> unn>代码>和匿名<代码>结构>代码>。要初始化什么?C或C++,这不能都是。特别是在C中。您需要使用<代码> TyPulfF/COD>来使用结构名作为类型,但是您不需要在C++中使用它。请在
。 aStruct.IDs