Анонимный союз внутри структуры против именованного типа объединения? - PullRequest
0 голосов
/ 07 января 2019

При чтении документации структуры BLUETOOTH_ADDRESS я обнаружил следующий код:

typedef struct _BLUETOOTH_ADDRESS {
  union {
    BTH_ADDR ullLong;
    BYTE     rgBytes[6];
  };
} BLUETOOTH_ADDRESS_STRUCT;

Это заставило меня задуматься; если мы определим структуру с единственным членом, являющимся (анонимным) объединением, в чем разница между этим и созданием именованного типа объединения?

union BLUETOOTH_ADDRESS_STRUCT {
    BTH_ADDR ullLong;
    BYTE     rgBytes[6];
};

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

Ответы [ 2 ]

0 голосов
/ 07 января 2019

@ Swordfish описывает важное различие в отношении будущего обслуживания и развития вашего кода. Но даже если мы рассмотрим только семантику двух альтернатив в их нынешнем виде, между объединением и структурой, единственным членом которой является анонимный союз, существует несколько неравенств. Однако некоторые из них являются различиями без каких-либо практических различий.

  • эти два типа не являются «совместимыми» в смысле стандарта этого термина, что примерно означает, что вы не можете использовать объект одного из тех типов, где требуется объект другого.

  • Помеченное объединение может иметь структуру-член с гибким элементом массива. Анонимный союз внутри структуры может не иметь такого члена (C2011, 6.7.2.1 / 3 ).

  • Вы можете использовать макрос offsetof (C2011, 7.19 / 3 ) со структурой и членами ее анонимного объединения, но не с теговым объединением.

  • Хотя стандарт требует, чтобы указатели на типы структур имели одинаковое представление, а для указателей на типы объединения должно быть одинаковое представление, он не требует указателей структурам, имеющим то же представление, что и указатели на объединения (C2011, 6.2.5 / 28 ).

  • Существует специальное положение для доступа к общей начальной последовательности структур, являющихся членами одного и того же объединения (c2011, 6.5.2.3 / 6 ). Это не относится к профсоюзам, которые являются членами профсоюза.

0 голосов
/ 07 января 2019

Одна из возможных причин, по которой мне приходит в голову использование struct, содержащего анонимный union вместо union, заключается в том, что в будущем к struct могут быть добавлены дополнительные члены. Нет способа сделать это с union.

...