KasperskyOS Community Edition 1.0

Типы данных 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 не вводит новый тип данных — оно вводит новые имена для уже существующих типов.