Составные типы данных
TYPEDEF := # Regular type 'type' :IDENT '=' ['align' NUMBER] '{' ( EXTTY [NUMBER] ), '}' | # Opaque type 'type' :IDENT '=' 'align' NUMBER '{' NUMBER '}'
Объявление составного типа данных типа начинаются с ключевого слова type
. Они записываются в файле, но типы должны быть определены до их применения. Внутренняя структура типа выражается разделенным запятыми списком простых типов, заключенных в фигурные скобки.
Aggregate type definitions start with the type keyword. They have file scope, but types must be defined before being referenced. The inner structure of a type is expressed by a comma-separated list of Simple Types enclosed in curly braces.
type :fourfloats = { s, s, d, d }
В промежуточном языке запятые обрабатываются препроцессором (их допустимость в синтаксисе служит лишь для удобства пользователя). Если в коде присутствует последовательно много элементов одного типа (например, в массиве C), то можно упростить синтаксис с помощью массива.
For ease of IL generation, a trailing comma is tolerated by the parser. In case many items of the same type are sequenced (like in a C array), the shorter array syntax can be used.
type :abyteandmanywords = { b, w 100 }
По умолчанию выравнивание составного типа является максимальным выравниванием его членов. Выравнивание может быть явно задано программистом.
By default, the alignment of an aggregate type is the maximum alignment of its members. The alignment can be explicitly specified by the programmer.
type :cryptovector = align 16 { w 4 }
Неопределенные типы используются, когда внутренняя структура составного типа не может быть определена в явном виде; выравнивание для неопределенных типов является обязательным. Они инициализируются простым указанием их размеров между в фигурных скобках.
Opaque types are used when the inner structure of an aggregate cannot be specified; the alignment for opaque types is mandatory. They are defined simply by enclosing their size between curly braces.
type :opaque = align 16 { 32 }
----
Источник: c9x.me