Похоже, вы вообще не беспокоитесь о профсоюзах, поэтому неясно, почему вы спрашиваете, как профсоюзы выступают в качестве членов структуры. Если они являются полезными структурами данных в целом (и я утверждаю, что они есть), то размещение их внутри структуры не снижает их полезности.
Фактически, размещение союзов внутри структур может увеличить их полезность. Одним из ключевых ограничений использования союзов является то, что они содержат только одного члена за раз, и (с некоторыми оговорками) вам разрешено читать только тот элемент, который был сохранен последним. Но как узнать, кто это? Один из способов - поместить объединение в структуру вместе с другим членом, который указывает, какой член объединения в настоящее время содержит значение. Этот шаблон называется под разными именами, в том числе «теговое объединение» и «вариант записи».
Но конкретный случай, о котором вы спрашивали, мрачнее:
typedef struct application
{
union
{
ITEM const *arr1;
ITEM *arr2;
}initial_array;
}APPLN;
Тип структуры с одним членом имеет довольно ограниченную полезность. Он имеет такое же требование выравнивания, как и все другие типы структур (которые, в принципе, могут отличаться от требования выравнивания для объединений), так что, возможно, есть приложение для этого. Кроме того, если один член является массивом, то его обертывание в структуре позволяет передавать и возвращать его по значению, но это не ваш случай.
По большей части, вместо определения типа структуры только с одним членом, я бы предпочел использовать тип элемента напрямую. Особенно, если я определяю псевдоним typedef
для ссылки на тип.
Кроме того, конкретная форма объединения в вашем примере немного касается. Единственными членами являются указатели на const
и не const
версии одного и того же типа данных, и, особенно без поля тега, основное использование, которое я вижу для этого, - это скрывать несогласованные действия программы от компилятора, поэтому чтобы избежать предупреждений и / или ошибок, которые на самом деле вполне оправданы.