Атрибут union
Ключевое слово объединения отображается в функциях, связанных с дискриминации профсоюзами.
/* Encapsulated union*/
typedef [[ [type-attribute-list] ]] union [[ struct-name ]] switch (switch-type switch-name) [[ union-name ]]
{
C-style-case-list
[[ [ field-attribute-list <> ] ]] type-specifier <> declarator-list <>;
...
}
/* Non-encapsulated union*/
typedef [switch_type(switch-type) [[ , type-attr-list ]] ] union [[ tag ]]
{
[ case ( limited-expr-list) ]
[[ [ field-attribute-list ] ]] type-specifier declarator-list;
[[ [ default ]
[[ [ field-attribute-list ] ]] type-specifier declarator-list;
]]
}
Параметры
-
type-attribute-list
-
Указывает ноль или более атрибутов, применяемых к типу объединения. Допустимые атрибуты типа включают [handle], [transmit_as]; атрибут указателя [unique], или [ptr]; и атрибуты использования [context_handle] и [ignore]. Инкапсулированные объединения также могут иметь атрибут типа указателя [ref] . Разделите несколько атрибутов запятыми.
-
имя структуры
-
Указывает необязательный тег, который именует структуру, созданную компилятором MIDL.
-
Switch-type
-
Задает тип int, char, перечисление или идентификатор, который разрешается в один из этих типов.
-
switch-name
-
Указывает имя переменной типа switch-type , которая выступает в качестве дискриминанта объединения.
-
union-name
-
Указывает необязательный идентификатор, который называет объединение в структуре, созданной компилятором MIDL, который содержит объединение и дискриминант.
-
C-style-case-list
-
Список "caseconst-expr:"
-
limited-expression-list
-
Задает одно или несколько выражений языка C. Компилятор MIDL поддерживает условные выражения, логические выражения, реляционные выражения и арифметические выражения. MIDL не разрешает вызовы функций в выражениях и не разрешает операторы увеличения и уменьшения. Отдельные выражения в списке должны быть разделены запятыми.
-
field-attribute-list
-
Указывает ноль или несколько атрибутов полей, которые применяются к члену объединения. Допустимые атрибуты полей включают [first_is], [last_is], [length_is], [max_is], [size_is]; атрибуты использования [string], [ignore], и [context_handle]; атрибут указателя [unique] или [ptr]; и для членов, не являющихся некапсулированными объединениями, атрибут объединения [switch_type]. Некапсулированные объединения также могут использовать атрибут поля указателя [ref] . Разделите несколько атрибутов поля запятыми.
-
описатель типа
-
Задает базовый тип, структуру, объединение, тип перечисления или идентификатор типа. Необязательная спецификация хранилища может предшествовать описательу типа.
-
declarator-list
-
Один или несколько стандартных деклараторов C, таких как идентификаторы, деклараторы указателей и деклараторы массива. (Деклараторы функций и объявления битового поля не допускаются в объединениях, передаваемых в удаленных вызовах процедур. За исключением случаев, когда вы используете параметр компилятора MIDL /osf, эти деклараторы разрешены в объединениях, которые не передаются.) Разделите несколько деклараторов запятыми.
-
Тег
-
Указывает необязательный тег.
Remarks
MIDL поддерживает два типа различаемых профсоюзов: инкапсулированные профсоюзы и некапсулированные профсоюзы. Инкапсулированный союз совместим с предыдущими реализациями RPC (NCA версии 1). Некапсулированное объединение устраняет некоторые ограничения инкапсулированного объединения и обеспечивает более заметный дискриминант, чем инкапсулированный союз.
Инкапсулированное объединение определяется ключевым словом switch и отсутствием других ключевых слов, связанных с объединением.
Некапсулированное объединение, также известное как объединение, определяется наличием ключевых слов [switch_is] и [switch_type] , которые определяют дискриминант и его тип.
При использовании объединения [in, out] следует учитывать, что изменение значения переключателя объединения во время вызова может отличаться от локального вызова. При возвращении заглушки копируют параметр [in, out] в память, которая уже присутствует на клиенте. Если удаленная процедура изменяет значение коммутатора объединения и, следовательно, изменяет размер объекта данных, заглушки могут перезаписать допустимую память значением [out] . Когда переключение объединения изменяет объект данных с базового типа на тип указателя, заглушки могут перезаписать допустимую память при копировании указателя в расположение памяти, указанное значением [in] базового типа.
Для обеспечения взаимосоединения форма объединения должна быть идентична на разных платформах.
См. также раздел