Типы данных IDL
Примитивные типы данных IDL
В IDL поддерживаются следующие примитивные типы данных:
SInt8
,SInt16
,SInt32
,SInt64
(знаковое целое);UInt8
,UInt16
,UInt32
,UInt64
(беззнаковое целое);Handle
(дескриптор).
Примеры объявления переменных примитивных типов:
SInt32 value;
UInt8 ch;
Handle ResID;
Для примитивных типов, кроме типа Handle
, можно объявить именованную константу с помощью ключевого слова const
:
const UInt32 c0 = 0;
const UInt32 c1 = 1;
Далее мы рассмотрим сложные (составные) типы данных: union
(вариантный тип), struct
(структура), array
(массив) и sequence
(последовательность).
Тип union
Вариантный тип union
, подобно обычному объединению в языке C, позволяет хранить значения разных типов в одной области памяти. Однако при передаче IPC-сообщения тип union
снабжается дополнительным полем tag
, позволяющим определить, какое именно поле объединения используется в переданном значении. Поэтому тип union
также называют объединением с тегом. Пример объявления переменной типа union
:
union foo {
UInt32 bar;
UInt8 baz;
}
Объявление вариантного типа является объявлением верхнего уровня.
Тип struct
Структуры в языке IDL аналогичны структурам в языке C. Пример объявления структуры:
struct BazInfo {
UInt64 x;
UInt64 y;
}
Объявление структуры является объявлением верхнего уровня.
Тип array
Массив (array
) имеет фиксированный размер, задаваемый в момент объявления:
array <ТипЭлемента, ЧислоЭлементов>
В IDL массивы анонимны и могут объявляться непосредственно при объявлении других сложных типов, а также при объявлении интерфейсов.
Для назначения имени объявляемому типу массива используется ключевое слово typedef
, например:
typedef array <SInt8, 1024> String;
Тип sequence
Последовательность (sequence
) напоминает массив переменного размера. При объявлении последовательности указывается максимальное число элементов, однако фактически можно передать меньшее их число. При этом для передачи будет задействовано столько памяти, сколько занимают передаваемые элементы.
Как и массивы, последовательности анонимны и могут объявляться непосредственно при объявлении интерфейсов, а также при объявлении других сложных типов:
sequence <ТипЭлемента, ЧислоЭлементов>
Пример объявления именованной последовательности:
typedef sequence <SInt8, 1024> String;
Вложенные сложные типы
Сложные типы можно использовать при объявлении других сложных типов. При этом массивы (array
) и последовательности (sequence
) могут объявляться непосредственно внутри другого составного типа:
struct BazInfo {
UInt64 x;
array <UInt8, 100> y;
sequence <sequence <UInt32, 100>, 200> z;
}
Типы union
или struct
должны объявляться перед использованием:
union foo {
UInt32 value1;
UInt8 value2;
}
struct bar {
UInt32 a;
UInt8 b;
}
struct BazInfo {
foo x;
bar y;
}
Объявление синонима типа (typedef)
Ключевое слово typedef
вводит имя, которое внутри своей области видимости является синонимом для указанного типа, например:
typedef array <UInt32, 20> value;
Конструкции typedef struct
и typedef union
недопустимы — ввести новое имя для структуры или вариантного типа можно только если они объявлены заранее:
union foo {
UInt32 value1;
UInt8 value2;
}
typedef foo bar;
Объявление typedef
не вводит новый тип данных — оно вводит новые имена для уже существующих типов.