1.4. Объединения
И Паскаль, и Си содержат сходное понятие, называемое: в Паскале - переменная (вариантная) структура записи, a в Си – union (объединение). Конкретные способы его описания показаны в примере:
Турбо Паскаль Турбо Си
type
<uname>=record union <uname>{
<fieldlist> <type><fnames>;
case<type> of <type><fnames>;
<vlist> :(<fieldlist>) ...
<vlist> :(<fieldlist>) <type><fnames>;
... };
<vlist> :(<fiedlist>)
end;
B Паскале <fiedlist> является обычной записью последовательностей <fname>:<type>;, повторяемой нужное количество раз.
Два основных различия между Паскалем и Си в следующем:
1) Паскаль заставляет положить объединение в основу регулярной записи, а Си - нет. Однако, вы можете сначала объявить объединение, а затем указать поле в структуре, принадлежащее типу, описанному в объединении.
2) Паскаль позволяет вам иметь множество типов для каждого варианта в объединении. Си позволяет иметь множество полей (<fnames>), но все должны быть одного типа.
Вот образец, написанный в Паскаль и Си версиях, как можно ближе к друг другу (однако, можно допустить, что они не вполне идентичны).
Турбо Паскаль Турбо C
type typedef union {
trick_word=record int w;
case integer of struct {
0:(w:integer); char lob;
1:(lob,hib:byte); char hib;
end; } b;
var xp:trick_word; } trick_word;
trick_word xc;
Примечание: определение trick_word ни в Си, ни в Паскале непереносимо. Они оба зависят от порядка байт 8086.
В Си объединении, как и в структуре, вы можете вставить поле <vnames> между закрытой скобкой и точкой с запятой, чтобы прямо указать переменные того типа. В этом операторе выбора вы можете оставить свободным <vnames>, если вы не собираетесь указывать больше таких переменных. Полями ссылок в Паскале являются: xp.w, xp.hib и xp.lob, а в Си - xc.w, xc.b.hib и xc.b.lob.