Использование объединения для штамповки типов непереносимо (хотя и не менее переносимо, чем любой другой метод наказания типов).
OTOH, синтаксический анализатор, для одного примера, обычно имеет объединение для представления значенийв выражениях.[Редактировать: я заменяю пример парсера на один, надеюсь, он немного более понятен]:
Давайте рассмотрим файл ресурсов Windows.Вы можете использовать его для определения ресурсов, таких как меню, диалоговые окна, значки и т. Д. Примерно так:
#define mn1 2
mn1 MENU
{
MENUITEM "File", -1, MENUBREAK
}
ico1 "junk.ico"
dlg1 DIALOG 100, 0, 0, 100, 100
BEGIN
FONT 14, "Times New Roman"
CAPTION "Test Dialog Box"
ICON ico1, 700, 20, 20, 20, 20
TEXT "This is a string", 100, 0, 0, 100, 10
LTEXT "This is another string", 200, 0, 10, 100, 10
RTEXT "Yet a third string", 300, 0, 20, 100, 10
LISTBOX 400, 20, 20, 100, 100
CHECKBOX "A combobox", 500, 100, 100, 200, 10
COMBOBOX 600, 100, 210, 200, 100
DEFPUSHBUTTON "OK", 75, 200, 200, 50, 15
END
При разборе MENU отображается определение меню;анализ DIALOG дает определение диалога и так далее.В синтаксическом анализаторе мы представляем это как объединение:
%union {
struct control_def {
char window_text[256];
int id;
char *class;
int x, y, width, height;
int ctrl_style;
} ctrl;
struct menu_item_def {
char text[256];
int identifier;
} item;
struct menu_def {
int identiifer;
struct menu_item_def items[256];
} mnu;
struct font_def {
int size;
char filename[256];
} font;
struct dialog_def {
char caption[256];
int id;
int x, y, width, height;
int style;
struct menu_def *mnu;
struct control_def ctrls[256];
struct font_def font;
} dlg;
int value;
char text[256];
};
Затем мы указываем тип, который будет создан путем анализа определенного типа выражения.Например, определение шрифта в файле становится font
членом объединения:
%type <font> font
Просто для пояснения, часть <font>
ссылается на созданный член объединения и второй «шрифт»ссылается на правило синтаксического анализатора, которое даст результат такого типа.Вот правило для этого конкретного случая:
font: T_FONT T_NUMBER "," T_STRING {
$$.size = $2;
strcpy($$.filename,$4);
};
Да, теоретически мы могли бы использовать структуру вместо объединения здесь - но, кроме потери памяти, она просто не делаетсмысл.Определение шрифта в файле only определяет шрифт.Не имеет смысла создавать структуру, которая включает определение меню, определение значка, номер, строку и т. Д. В дополнение к определенному шрифту.[конец редактирования]
Конечно, использование союзов для экономии памяти редко бывает очень важным.Хотя сейчас это может показаться довольно тривиальным, но когда было много 64 КБ ОЗУ, экономия памяти означала гораздо больше.