Пространства имен помогают организовать ваш код в логические части, предотвратить столкновения имен и позволяют вам легче интегрировать ваш сгенерированный код С++ в больший проект C++. Пространства имен также повышают податливость стандартам MISRA C++ для критически важного кода безопасности. В этом разделе описывается, как использовать настройки генерации кода для настройки организации вашего сгенерированного кода С++ в пространства имен.
Это настройки генерации кода, которые позволяют вам управлять созданием пространств имен в сгенерированном коде:
Параметр конфигурации кода | Описание | Как задать |
---|---|---|
В объекте строения кода: В 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 ®
Задайте две функции 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.2 // C/C++ source code generated on : 21-Apr-2021 01:22:39 // #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.2 // C/C++ source code generated on : 21-Apr-2021 01:22:39 // #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
который реализует тип строковых данных MATLAB. Потому что вы поручили генератору кода поместить весь код, произведенный для кода MathWorks, в пространство имен notmycode
, сгенерированный класс rtString
объявлен в иерархии пространства имен allcode::notmycode
.
type codegen/lib/foo/string1.h
// // File: string1.h // // MATLAB Coder version : 5.2 // C/C++ source code generated on : 21-Apr-2021 01:22:39 // #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