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 }};
Я получаю "слишком много значений инициализатора". Любая помощь будет очень признательна, спасибо.
В 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 }}}};
...
Может ли кто-нибудь прокомментировать переносимость назначенных инициализаторов? На мой взгляд, это намного яснее, чем многие вложенные скобки.
struct EXMPL aStruct = {
.Rev = { 0xAB, 0xCD, 0xEF, 0x00 },
.IDs = { 0x01, 0x10, 0x11, 0x00 }
};
Не говоря уже о том, что это позволяет напрямую инициализировать A и B, если это необходимо.
Вы не можете напрямую установить внешнюю структуру в один из членов объединения. Вы должны установить один из членов союза внутри EXMPL.
В качестве справки следуйте этому простому примеру.
Скажем, у меня есть это определение структуры:
struct unionExample {
union{
int integerInUnion;
long longInUnion;
}
}
Если вы хотите установить член объединения в 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 }};
Конечно, вы получаете слишком много ошибок инициализаторов. Вы используете слишком много инициализаторов. Союз в любой момент имеет только один из его членов. Не два, не три, не девять.
Вы также должны выбрать язык. C и C++ не совпадают с длинным выстрелом. У профсоюзов мало места в большинстве программ C++. Они были рядом с бесполезными до недавнего времени, когда правила относительно того, что они могли провести, изменились, но еще мало случаев, когда вы действительно хотите или нуждаетесь в союзе.
union
,UNN
и анонимнойstruct
. Что инициализировать?