Пространства имен помогают организовать ваш код в логические части, предотвратить столкновения имени и позволить вам более легко интегрировать свой сгенерированный Код С++ в больший проект 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.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.1
// C/C++ source code generated on : 17-Aug-2020 20:27:40
//
#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.1
// C/C++ source code generated on : 17-Aug-2020 20:27:40
//
#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);
}
}
#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.1
// C/C++ source code generated on : 17-Aug-2020 20:27:40
//
#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;
};
}
}
#endif
//
// File trailer for string1.h
//
// [EOF]
//
coder.CodeConfig | coder.EmbeddedCodeConfig | coder.MexCodeConfig