Язык С


         

Объединения могут появляться внутри структур


IF (UTYPE == INT) PRINTF("%D\N", UVAL.IVAL); ELSE IF (UTYPE == FLOAT) PRINTF("%F\N", UVAL.FVAL); ELSE IF (UTYPE == STRING) PRINTF("%S\N", UVAL.PVAL); ELSE PRINTF("BAD TYPE %D IN UTYPE\N", UTYPE);

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

STRUCT \( CHAR *NAME; INT FLAGS; INT UTYPE; UNION \( INT IVAL; FLOAT FVAL; CHAR *PVAL; \) UVAL; \) SYMTAB[NSYM];

на переменную IVAL можно сослаться как

SYMTAB[I].UVAL.IVAL

а на первый символ строки PVAL как

*SYMTAB[I].UVAL.PVAL

В сущности объединение является структурой, в которой все члены имеют нулевое смещение. Сама структура достаточно ве- лика, чтобы хранить "самый широкий" член, и выравнивание пригодно для всех типов, входящих в объединение. Как и в случае структур, единственными операциями, которые в настоя- щее время можно проводить с объединениями, являются доступ к

члену и извлечение адреса; объединения не могут быть присво- ены, переданы функциям или возвращены ими. указатели объеди- нений можно использовать в точно такой же манере, как и ука- затели структур. Программа распределения памяти, приводимая в главе 8 , показывает, как можно использовать объединение, чтобы сде- лать некоторую переменную выровненной по определенному виду границы памяти.




    Содержание  Назад  Вперед