Пространства имен помогают организовать ваш код в логические части, предотвратить столкновения имени и позволить вам более легко интегрировать свой сгенерированный Код С++ в больший проект C++. Пространства имен также увеличивают податливость со стандартами C++ MISRA для критического по отношению к безопасности кода. Эта тема объясняет, как использовать настройки генерации кода, чтобы настроить организацию вашего сгенерированного Кода С++ в пространства имен.
Это настройки генерации кода, которые позволяют вам управлять созданием пространств имен в сгенерированном коде:
Параметр конфигурации кода | Описание | Как задать |
---|---|---|
В объекте настройки кода: В MATLAB® Приложение Coder™: На вкладке Code Appearance, C++ Namespace | Пространство имен, которое содержит сгенерированный Код С++. Если этот параметр пуст, генератор кода не создает такое пространство имен. | В объекте настройки кода: В приложении MATLAB Coder: задайте в текстовом поле |
В объекте настройки кода: В приложении MATLAB Coder: На вкладке Code Appearance, Namespace for MathWorks functions | Пространство имен, которое содержит код, сгенерированный для всего MathWorks® код (например, код для разреженного типа данных). Если этот параметр пуст, генератор кода не создает такое пространство имен. | В объекте настройки кода: В приложении MATLAB Coder: задайте в текстовом поле |
В объекте настройки кода: В приложении MATLAB Coder: На вкладке Code Appearance, MATLAB package to C++ namespace | Сгенерировать ли пространства имен C++ для пакетов в коде MATLAB. | В объекте настройки кода: В приложении MATLAB Coder: На вкладке Code Appearance выберите или снимите флажок MATLAB package to C++ namespace |
Дополнительные примечания о генерации пространства имен:
Когда вы задаете CppNamespace
свойство (или соответствующая установка в приложении), пакеты генератора кода все сгенерированные функции и определения типа в пространство имен, за исключением типовых определений типа содержится в tmwtypes.h
и специфичные для оборудования определения в rtwtypes.h
. Пример основной файл и функция не упакован в пространство имен.
Если ваш код MATLAB вложил пакеты (например, pkg1
в pkg2
), сгенерированные пространства имен имеют то же вложение.
При создании пакетов для кода MATLAB, который предназначается для генерации кода, следуйте этим инструкциям:
Не создавайте пакет, который имеет имя 'coder'
.
Если вы устанавливаете CppNamespaceForMathworksCode
свойство (или эквивалентный параметр в приложении) к имени не по умолчанию, не создавайте пакет, который имеет то имя.
В этом примере показано, как использовать эти настройки генерации кода, чтобы создать пространства имен.
Задайте MATLAB® Functions
Задайте две функции MATLAB foo
и bar
в двух отдельных файлах foo.m
и bar.m
. Поместите файл bar.m
в пакете myPackage
. Функциональный foo
принимает вход строки и затем вызывает функциональный bar
.
type foo.m
function out = foo(str) temp = strlength(str); out = mypackage.bar(temp); end
type +mypackage/bar.m
function out = bar(in) coder.inline('never'); out = in + 1; end
Задайте объект настройки кода
Создайте объект настройки кода для статической библиотеки. Установите выходной язык на C++. Задайте пространство имен, которое содержит весь сгенерированный код, который назовут allcode
. Задайте пространство имен, которое содержит код MathWorks®, который назовут notmycode
.
cfg = coder.config('lib'); cfg.TargetLang = 'C++'; cfg.CppNamespace = 'allcode'; cfg.CppNamespaceForMathworksCode = 'notmycode';
Сгенерируйте код
Сгенерируйте статическую библиотеку C++ и отчет генерации кода. Задайте входной тип, чтобы быть строковым скаляром, который может иметь любую длину.
s = "mystring"; t = coder.typeof(s); t.Properties.Value = coder.typeof('a',[1 inf]); codegen -config cfg foo -args {t} -report
Code generation successful: To view the report, open('codegen/lib/foo/html/report.mldatx')
Смотрите сгенерированный код
Откройте отчет генерации кода и смотрите сгенерированный код.
Файл foo.h
содержит объявление сгенерированного функционального foo
. Поскольку функция MATLAB foo
то, что вы создали, не в пакете, сгенерированная функция объявляется только в пространстве имен allcode
это содержит весь сгенерированный код.
type codegen/lib/foo/foo.h
// // File: foo.h // // MATLAB Coder version : 5.3 // C/C++ source code generated on : 25-Aug-2021 05:30:37 // #ifndef FOO_H #define FOO_H // Include Files #include "rtwtypes.h" #include "string1.h" #include <cstddef> #include <cstdlib> // Function Declarations namespace allcode { extern double foo(const notmycode::rtString *str); } #endif // // File trailer for foo.h // // [EOF] //
Файл bar.h
содержит объявление сгенерированного функционального bar
. Поскольку вы создали функцию MATLAB bar
в пакете mypackage
, сгенерированная функция объявляется в иерархии пространства имен allcode::myPackage
.
type codegen/lib/foo/bar.h
// // File: bar.h // // MATLAB Coder version : 5.3 // C/C++ source code generated on : 25-Aug-2021 05:30:37 // #ifndef BAR_H #define BAR_H // Include Files #include "rtwtypes.h" #include <cstddef> #include <cstdlib> // Function Declarations namespace allcode { namespace mypackage { double bar(double in); } } // namespace allcode #endif // // File trailer for bar.h // // [EOF] //
Файл string1.h
содержит объявление сгенерированного класса rtString
это реализует тип данных String MATLAB. Поскольку вы дали генератору кода команду помещать весь код, произведенный для кода MathWorks в пространстве имен notmycode
, сгенерированный класс rtString
объявляется в иерархии пространства имен allcode::notmycode
.
type codegen/lib/foo/string1.h
// // File: string1.h // // MATLAB Coder version : 5.3 // C/C++ source code generated on : 25-Aug-2021 05:30:37 // #ifndef STRING1_H #define STRING1_H // Include Files #include "rtwtypes.h" #include "coder_array.h" #include <cstddef> #include <cstdlib> // Type Definitions namespace allcode { namespace notmycode { class rtString { public: void init(const ::coder::array<char, 2U> &b_Value); rtString(); ~rtString(); ::coder::array<char, 2U> Value; }; } // namespace notmycode } // namespace allcode #endif // // File trailer for string1.h // // [EOF] //
coder.CodeConfig
| coder.EmbeddedCodeConfig
| coder.MexCodeConfig