Прочитать на английском

Поделиться через


union ключевое слово (RPC)

Для некоторых функций языка C, таких как объединения, требуются специальные ключевые слова MIDL для поддержки их использования в удаленных вызовах процедур. Объединение в языке C — это переменная, содержащая объекты разных типов и размеров. Разработчик обычно создает переменную для отслеживания типов, хранящихся в объединении. Для правильной работы в распределенной среде переменная, указывающая тип объединения или дискриминант, также должна быть доступна удаленному компьютеру. MIDL предоставляет ключевые слова [switch_type] и [switch_is] для идентификации дискриминантного типа и имени.

MIDL требует, чтобы дискриминант передавался с объединением одним из двух способов:

  • Объединение и дискриминант должны быть указаны в качестве параметров.
  • Объединение и дискриминант должны быть упаковываны в структуру.

MIDL предоставляет два основных типа дискриминируемых профсоюзов: nonencapsulated_union и encapsulated_union. Дискриминант некапсулированного объединения является другим параметром, если объединение является параметром. Это другое поле, если объединение является полем структуры. Определение инкапсулированного объединения преобразуется в определение структуры, первое поле которого является дискриминантом, а второе и последнее поля — объединение. В следующем примере показано, как предоставить объединение и дискриминант в качестве параметров:

typedef [switch_type(short)] union 
{
    [case(0)]    short     sVal;
    [case(1)]    float     fVal;
    [case(2)]    char      chVal;
    [default]    ;
} DISCRIM_UNION_PARAM_TYPE;
 
short UnionParamProc(
    [in, switch_is(sUtype)] DISCRIM_UNION_PARAM_TYPE Union,
    [in] short sUtype);

Объединение в предыдущем примере может содержать одно значение: short, float или char. Определение типа для объединения включает атрибут MIDL switch_type , указывающий тип дискриминанта. Здесь [switch_type(short)] указывает, что дискриминант имеет тип short. Параметр должен иметь целочисленный тип.

Если объединение является членом структуры, дискриминант должен быть членом той же структуры. Если объединение является параметром, дискриминант должен быть другим параметром. В прототипе функции UnionParamProc в предыдущем примере показан дискриминантный sUtype в качестве последнего параметра вызова. (Дискриминант может отображаться в любом положении в вызове.) Тип параметра, указанного в атрибуте [switch_is] , должен соответствовать типу, указанному в атрибуте [switch_type] .

В следующем примере показано использование одной структуры, которая упаковает дискриминант с объединением:

typedef struct 
{
    short utype;  /* discriminant can precede or follow union */
    [switch_is(utype)] union 
    {
       [case(0)]   short     sVal;
       [case(1)]   float     fVal;
       [case(2)]   char      chVal;
       [default]   ;
    } u;
} DISCRIM_UNION_STRUCT_TYPE;
 
short UnionStructProc(
    [in] DISCRIM_UNION_STRUCT_TYPE u1);

Компилятор Microsoft RPC MIDL позволяет объявлять объединения за пределами конструкций typedef . Эта функция является расширением для DCE IDL. Дополнительные сведения см. в разделе union.