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

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

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

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

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

В объекте настройки кода: 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® 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.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 это реализует тип данных String 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]
//

Смотрите также

| |

Похожие темы