инициализация объединения структур

1
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
    Кого из членов союза вы хотите инициализировать? Вы можете использовать только один за раз.
  • 0
    В вашем коде нет экземпляра union , UNN и анонимной struct . Что инициализировать?
Показать ещё 2 комментария
Теги:

4 ответа

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
    Дополнительный бонус, как только требования к именованию в C ++ будут решены, это сработает (угадайте, что?) В C ++.
1

Может ли кто-нибудь прокомментировать переносимость назначенных инициализаторов? На мой взгляд, это намного яснее, чем многие вложенные скобки.

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

Не говоря уже о том, что это позволяет напрямую инициализировать A и B, если это необходимо.

1

Вы не можете напрямую установить внешнюю структуру в один из членов объединения. Вы должны установить один из членов союза внутри 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 }};
  • 0
    Довольно полный ответ на другой вопрос. Я сам виноват в этом время от времени, так что никаких отрицательных голосов, но вы это компилировали?
  • 0
    Нет, у меня не было времени на компиляцию, но я просто хотел обрисовать, в чем проблема в этом случае.
Показать ещё 1 комментарий
1

Конечно, вы получаете слишком много ошибок инициализаторов. Вы используете слишком много инициализаторов. Союз в любой момент имеет только один из его членов. Не два, не три, не девять.

Вы также должны выбрать язык. C и C++ не совпадают с длинным выстрелом. У профсоюзов мало места в большинстве программ C++. Они были рядом с бесполезными до недавнего времени, когда правила относительно того, что они могли провести, изменились, но еще мало случаев, когда вы действительно хотите или нуждаетесь в союзе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню