Пространства имен помогают упорядочить код в логические части, предотвратить конфликты имен и упростить интеграцию созданного кода C++ в более крупный проект C++. Пространства имен также повышают соответствие стандартам MISRA C++ для критического для безопасности кода. В этом разделе объясняется, как использовать параметры создания кода для настройки организации созданного кода C++ в пространствах имен.
Ниже приведены параметры создания кода, позволяющие управлять созданием пространств имен в сгенерированном коде.
| Параметр конфигурации кода | Описание | Как указать |
|---|---|---|
В объекте конфигурации кода: В приложении MATLAB ® Coder™: на вкладке «Внешний вид кода» пространство имен C++ | Пространство имен, содержащее созданный код C++. Если этот параметр пуст, генератор кода не создает такое пространство имен. | В объекте конфигурации кода: В приложении MATLAB Coder: укажите в текстовом поле |
В объекте конфигурации кода: В приложении MATLAB Coder на вкладке Code Appearance выберите Namespace for MathWorks. | Пространство имен, содержащее код, созданный для всего кода MathWorks ® (например, код для разреженного типа данных). Если этот параметр пуст, генератор кода не создает такое пространство имен. | В объекте конфигурации кода: В приложении MATLAB Coder: укажите в текстовом поле |
В объекте конфигурации кода: В приложении Кодер MATLAB на вкладке Внешний вид кода пакет MATLAB в пространство имен C++ | Нужно ли создавать пространства имен C++ для пакетов в коде MATLAB. | В объекте конфигурации кода: В приложении Кодер MATLAB на вкладке Внешний вид кода установите или снимите флажок для пакета MATLAB в пространство имен C++ |
Дополнительные примечания о создании пространства имен:
При указании 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.mfunction out = foo(str) temp = strlength(str); out = mypackage.bar(temp); end
type +mypackage/bar.mfunction 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