Файлы шаблона генерации кода (CGT)

Генерация кода Шаблона (CGT) файлы определяют организацию верхнего уровня и форматирование сгенерированных исходного кода и заголовочных файлов. Файлы CGT имеют следующие приложения:

  • Генерация пользовательских баннеров (разделов комментариев) в файлах кода. См. «Генерация пользовательских файлов и функциональных баннеров».

  • Для генерации пользовательского кода с использованием шаблона CFP требуется файл CGT. Чтобы использовать шаблоны CFP, необходимо понять структуру файла CGT. Однако во многих случаях можно использовать файл CGT по умолчанию, не изменяя его.

Файл CGT по умолчанию

Программное обеспечение генерации кода предоставляет файл CGT по умолчанию, matlabroot/ toolbox/rtw/targets/ecoder/ert_code_template.cgt. Основывайте свои пользовательские файлы CGT на файле по умолчанию.

Структура файла CGT

Файл CGT состоит из одного необходимого раздела и четырех необязательных разделов:

Раздел вставки кода

(Обязательно) Этот раздел содержит лексемы, которые определяют упорядоченное разбиение сгенерированного кода на несколько разделов (таких как Includes и Defines разделы). Лексемы имеют форму:

%<SectionName>

Для примера,

%<Includes>

Программное обеспечение генерации кода определяет минимальный набор необходимых лексем. Эти лексемы генерируют исходный код C или C++ или код заголовка. Они являются встроенными лексемами (см. «Встроенные лексемы» и «Разделы»). Можно также задать пользовательские лексемы и пользовательские разделы.

Каждая лексема функционирует как заполнитель для соответствующего раздела сгенерированного кода. Упорядоченное расположение лексем определяет порядок, в котором соответствующие разделы появляются в сгенерированном коде. Если вы не включаете лексему, то соответствующий раздел не генерируется. Чтобы сгенерировать код в конкретный раздел, явным образом вызовите API шаблона кода из шаблона CFP, как описано в Custom File Processing (CFP) Templates.

Лексемы CGT определяют высокоуровневую организацию сгенерированного кода. Используя API шаблона кода, можно разделить каждую секцию кода на именованные подразделы, как описано в подразделах.

В разделе вставки кода можно также вставить комментарии C или C++ между лексемами. Такие комментарии излучаются непосредственно в сгенерированный код.

Файл «Файловое знамя»

(Необязательно) Этот раздел содержит комментарии и лексемы, используемые при создании пользовательского баннера файлов.

Секция функционального баннера

(Необязательно) Этот раздел содержит комментарии и лексемы для использования при создании пользовательского баннера функций.

Раздел баннера общих служебных функций

(Необязательно) Этот раздел содержит комментарии и лексемы для использования при создании пользовательского баннера общих служебных функций.

Раздел трейлера файлов

(Необязательно) Этот раздел содержит комментарии для использования при создании пользовательского баннера трейлера.

Для получения дополнительной информации об этих разделах см. «Генерация пользовательских файловых и функциональных баннеров».

Встроенные лексемы и разделы

Следующий экстракт кода показывает необходимый раздел вставки кода файла CGT по умолчанию с необходимыми встроенными лексемами.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Code insertion section (required)
%%   These are required tokens. You can insert comments and other tokens in
%% between them, but do not change their order or remove them.
%%
%<Includes>
%<Defines>
%<Types>
%<Enums>
%<Definitions>
%<Declarations>
%<Functions>

Обратите внимание на следующие требования к настройке файла CGT:

  • Не удаляйте необходимые встроенные лексемы.

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

  • Только одна лексема на линию.

  • Не повторяйте лексемы.

  • Вы можете добавить пользовательские лексемы и комментарии к разделу вставки кода, если вы не нарушаете предыдущие требования.

Примечание

Если вы изменяете файл CGT, а затем перестраиваете модель, процесс генерации кода не форсирует сборку верхней модели. Для регенерации кода см. Раздел «Принудительная регенерация кода верхней модели».

В следующей таблице представлены встроенные лексемы и соответствующие имена разделов, а также описаны секции кода.

Встроенные лексемы CGT и соответствующие секции кода

Лексема и раздела

Описание

Includes

#include раздел директивы

Defines

#define раздел директивы

Types

typedef раздел. Typedefs может зависеть от ранее определенного типа

Enums

Раздел перечисляемых типов

Definitions

Определения данных (для примера, double x = 3.0;)

Declarations

Объявления данных (для примера, extern double x;)

Functions

Функции C или C++

Подразделы

Можно задать один или несколько именованных подразделов для любого сечения. Некоторые встроенные разделы имеют предопределенные подразделы, представленные в таблице «Подразделы, определенные для встроенных разделов».

Примечание

Разделы и подразделы излучаются в исходный или заголовочный файл в порядке, указанном в файле CGT.

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

Подразделы, определенные для встроенных разделов

Раздел

Подразделы

Описание подраздела

Includes

Н/Д

 

Defines

Н/Д

 

Types

IntrinsicTypes

Внутренняя typedef раздел. Внутренние типы зависят только от внутренних типов C или C++.

Types

PrimitiveTypedefs

Примитивные typedef раздел. Примитивные typedefs зависит только от собственных типов C или C++ и от typedefs, ранее заданные в IntrinsicTypes раздел.

Types

UserTop

Вы можете разместить в этом разделе любой тип кода, включая код, который имеет зависимости от предыдущих разделов.

Types

Typedefs

typedef раздел. Typedefs может зависеть от ранее определенных типов

Enums

Н/Д

 

Definitions

Н/Д

 

Declarations

Н/Д

 

Functions

 

Функции C или C++

Functions

CompilerErrors

#error директивы

Functions

CompilerWarnings

#warning директивы

Functions

Documentation

Раздел документации (комментарий)

Functions

UserBottom

Вы можете разместить любой код в этом разделе.