Когда вкладывать союз внутри структуры как выбор дизайна - PullRequest
0 голосов
/ 14 июня 2019

Это может быть наивный вопрос, у меня есть четкое представление о структурах и объединениях, и я видел использование вложенного объединения внутри структуры в сетевом программировании и программировании пользовательского интерфейса. Но так как эти коды существуют издалека, я не могу понять, каким будет выбор дизайна или преимущество, которое приведет к этому решению. Зачем мне вкладывать объединение в структуру и каковы будут преимущества, или это наследие, которое я перенес. Коды, которые я видел, в основном C. Пример кода выглядит следующим образом

typedef struct   
{  
int address1;  
int addresslocation;  
int addresstype;  
}ITEM;  

typedef struct application  
{   
    union  
    {  
        ITEM const *arr1;  
        ITEM *arr2;  
    }initial_array;  
}APPLN;  

1 Ответ

2 голосов
/ 14 июня 2019

Похоже, вы вообще не беспокоитесь о профсоюзах, поэтому неясно, почему вы спрашиваете, как профсоюзы выступают в качестве членов структуры. Если они являются полезными структурами данных в целом (и я утверждаю, что они есть), то размещение их внутри структуры не снижает их полезности.

Фактически, размещение союзов внутри структур может увеличить их полезность. Одним из ключевых ограничений использования союзов является то, что они содержат только одного члена за раз, и (с некоторыми оговорками) вам разрешено читать только тот элемент, который был сохранен последним. Но как узнать, кто это? Один из способов - поместить объединение в структуру вместе с другим членом, который указывает, какой член объединения в настоящее время содержит значение. Этот шаблон называется под разными именами, в том числе «теговое объединение» и «вариант записи».

Но конкретный случай, о котором вы спрашивали, мрачнее:

typedef struct application  
{   
    union  
    {  
        ITEM const *arr1;  
        ITEM *arr2;  
    }initial_array;  
}APPLN;

Тип структуры с одним членом имеет довольно ограниченную полезность. Он имеет такое же требование выравнивания, как и все другие типы структур (которые, в принципе, могут отличаться от требования выравнивания для объединений), так что, возможно, есть приложение для этого. Кроме того, если один член является массивом, то его обертывание в структуре позволяет передавать и возвращать его по значению, но это не ваш случай.

По большей части, вместо определения типа структуры только с одним членом, я бы предпочел использовать тип элемента напрямую. Особенно, если я определяю псевдоним typedef для ссылки на тип.

Кроме того, конкретная форма объединения в вашем примере немного касается. Единственными членами являются указатели на const и не const версии одного и того же типа данных, и, особенно без поля тега, основное использование, которое я вижу для этого, - это скрывать несогласованные действия программы от компилятора, поэтому чтобы избежать предупреждений и / или ошибок, которые на самом деле вполне оправданы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...