Организуйте сгенерированный код С++ в пространства имен

Пространства имен помогают организовать ваш код в логические части, предотвратить столкновения имен и позволяют вам легче интегрировать ваш сгенерированный код С++ в больший проект C++. Пространства имен также повышают податливость стандартам MISRA C++ для критически важного кода безопасности. В этом разделе описывается, как использовать настройки генерации кода для настройки организации вашего сгенерированного кода С++ в пространства имен.

Настройки, которые управляют структурой пространства имен

Это настройки генерации кода, которые позволяют вам управлять созданием пространств имен в сгенерированном коде:

Параметр конфигурации кодаОписаниеКак задать

В объекте строения кода: CppNamespace

В MATLAB® Coder™ приложение: На вкладке Code Appearance, C++ Namespace

Пространство имен, которое содержит сгенерированный код С++.

Если этот параметр пуст, генератор кода не создает такое пространство имен.

В объекте строения кода: '' (по умолчанию) | вектор символов

В приложении MATLAB Coder: укажите в текстовом поле

В объекте строения кода: CppNamespaceForMathworksCode

В приложении MATLAB Coder: На вкладке Code Appearance, Namespace for MathWorks functions

Пространство имен, которое содержит код, сгенерированный для всех MathWorks® код (для примера, код для разреженного типа данных).

Если этот параметр пуст, генератор кода не создает такое пространство имен.

В объекте строения кода: 'coder' (по умолчанию) | вектор символов

В приложении MATLAB Coder: укажите в текстовом поле

В объекте строения кода: CppPackagesToNamespaces

В приложении MATLAB Coder: На вкладке Code Appearance, MATLAB package to C++ namespace

Будет ли генерировать пространства имен C++ для пакетов в коде MATLAB.

В объекте строения кода: true (по умолчанию) | false

В приложении 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]
//

См. также

| |

Похожие темы