Структуры (Structures)

Пользовательские типы могут быть созданы путем объединения других, уже определенных, типов в структуры, используя ключевое слово struct. Например:

struct light {
 float intensity;
 vec3 position;
} lightVar;

В данном примере light является именем нового типа, а lightVar является переменной данного типа. Что бы объявить переменную нового типа, используйте имя типа (без ключевого слова struct).

light lightVar2;

Формально структуры объявляются следующим образом, однако полная правильная грамматика приведена в разделе 9 “Shading Language Grammar”.

Объявление-структуры:
спецификаторопционально struct имяопционально {список-членовопределяемый-объектопционально ;

список-членов:
объявляемый-член;
объявляемый-член список-членов;

объявляемый-член;
базовый-тип определяемого-объекта;

где имя становится типом определяемым пользователем, и может быть использовано для объявления переменных этого нового типа. Имя разделяет пространство имен с остальными переменными, типами и функциями. Все найденные ранее переменный, типы, структуры или функции с таким же именем будут скрыты. Опциональный спецификатор может применяться к любым определяемым-объектам и не является частью типа.

Структуры должны иметь как минимум один объявляемый член. Объявления членов могут содержать спецификаторы, но использование любого другого классификатора приводит к ошибке времени компиляции. Битовые поля не поддерживаются. Типы членов должны быть уже определены (никаких ссылок на будущие элементы). Содержание инициализатора в объявлении элемента приводит к ошибке времени компиляции. Объявляемые члены могут содержать массивы. Такие массивы должны иметь указанный размер, и размер должен быть интегральным постоянным выражением, которое больше нуля (см. раздел 4.3.3 “Constant Expressions”). Каждый уровень структуры имеет собственное пространство для имен, указанных в объявляемых членах, эти имена должны быть уникальными только в этом пространстве имен.

Поддерживаются анонимные структуры. Определение встроенной структуры не поддерживается, это приводит к ошибкам времени компиляции.

struct S { float f; };
struct T {
S;              // Error: анонимные структуры запрещены
struct { ... }; // Error: Встроенные структуры запрещены
S s;            // Okay: Допускаются вложенные структуры с именем
};

Структуры могут быть инициализированы во время объявления с использованием конструкторов, как описано в разделе 5.4.3  “Structure Constructors” .

Любые ограничения на использование типа или спецификатора также применяются к любой структуре, содержащей член данного типа или спецификатора, и так по рекурсии.

Main Admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *