Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

生成された C++ コードの名前空間への整理

名前空間を使用すると、コードを論理パーツに整理して名前の競合を防ぐことができ、生成された C++ コードをより大きな C++ プロジェクトに簡単に統合できるようになります。また、名前空間を使用すると、セーフティ クリティカルなコードの MISRA C++ 規格への準拠性が高まります。このトピックでは、コード生成設定を使用して、生成された C++ コードの名前空間への整理をカスタマイズする方法について説明します。

名前空間構造を制御する設定

生成コードでの名前空間の作成を制御できるコード生成設定は次のとおりです。

コード構成パラメーター説明指定方法

コード構成オブジェクトの場合: CppNamespace

MATLAB® Coder™ アプリの場合: [コード外観] タブの [C++ 名前空間]

生成された C++ コードを含む名前空間。

このパラメーターが空の場合、コード ジェネレーターはこのような名前空間を作成しません。

コード構成オブジェクトの場合: '' (既定値)| 文字ベクトル

MATLAB Coder アプリの場合: テキスト フィールドで指定

コード構成オブジェクトの場合: CppNamespaceForMathworksCode

MATLAB Coder アプリの場合: [コード外観] タブの [MathWorks コードの名前空間]

すべての MathWorks® コードに対して生成されたコード (スパース データ型のコードなど) を含む名前空間。

このパラメーターが空の場合、コード ジェネレーターはこのような名前空間を作成しません。

コード構成オブジェクトの場合: 'coder' (既定値)| 文字ベクトル

MATLAB Coder アプリの場合: テキスト フィールドで指定

コード構成オブジェクトの場合: CppPreserveNamespaces

MATLAB Coder アプリの場合: [コード外観] タブの [MATLAB 名前空間から C++ 名前空間を生成]

MATLAB コード内の名前空間に対して C++ 名前空間を生成するかどうかを指定します。

コード構成オブジェクトの場合: true (既定値)| false

MATLAB Coder アプリの場合: [コード外観] タブで、[MATLAB 名前空間から C++ 名前空間を生成] チェック ボックスをオンまたはオフにする

名前空間の生成に関するその他のメモ:

  • CppNamespace プロパティ (またはアプリの対応する設定) を指定すると、コード ジェネレーターは、生成されたすべての関数と型定義を名前空間にパッケージ化します (tmwtypes.h に含まれる汎用的な型定義および rtwtypes.h にあるハードウェア固有の定義を除く)。この main ファイルの例と関数は、名前空間にパッケージ化されません。

  • MATLAB コードに入れ子にされた名前空間がある場合 (nmsp2 内の nmsp1 など)、生成されたコード内の名前空間は同じ入れ子構造になります。

  • コード生成用の MATLAB コードの名前空間を作成する場合は、以下のガイドラインに従います。

    • 'coder' という名前の名前空間は作成しないでください。

    • CppNamespaceForMathworksCode プロパティ (またはアプリの同等のパラメーター) を既定以外の名前に設定する場合、その名前の名前空間は作成しないでください。

例: C++ コードと名前空間の生成

この例では、以下のコード生成設定を使用して名前空間を作成する方法を示します。

MATLAB® 関数の定義

2 つの MATLAB 関数 foo および bar を 2 つの個別のファイル foo.m および bar.m で定義します。ファイル bar.m を MATLAB 名前空間 myNamespace に配置します。関数 foo は string 入力を受け入れ、関数 bar を呼び出します。

type foo.m
function out = foo(str)
temp = strlength(str);
out = myNamespace.bar(temp);
end
type +myNamespace/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++ スタティック ライブラリとコード生成レポートを生成します。入力型を、任意の長さにすることができる string スカラーに指定します。

t = coder.typeof("string");
t.StringLength = Inf;
% Setting t.StringLength to Inf automatically sets t.VariableStringLength to
% true

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 は MATLAB 名前空間にないため、生成された関数は、生成コードを含む C++ 名前空間 allcode 内でのみ宣言されています。

type codegen/lib/foo/foo.h
//
// File: foo.h
//
// MATLAB Coder version            : 24.1
// C/C++ source code generated on  : 20-Apr-2024 06:06:03
//

#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 を MATLAB 名前空間 myNamespace 内に作成したため、生成された関数は C++ 名前空間階層 allcode::myNamespace 内で宣言されています。

type codegen/lib/foo/bar.h
//
// File: bar.h
//
// MATLAB Coder version            : 24.1
// C/C++ source code generated on  : 20-Apr-2024 06:06:03
//

#ifndef BAR_H
#define BAR_H

// Include Files
#include "rtwtypes.h"
#include <cstddef>
#include <cstdlib>

// Function Declarations
namespace allcode {
namespace myNamespace {
double bar(double in);

}
} // namespace allcode

#endif
//
// File trailer for bar.h
//
// [EOF]
//

ファイル string1.h には、MATLAB string データ型を実装する生成されたクラス rtString の宣言が含まれています。MathWorks コードに対して生成されたすべてのコードを名前空間 notmycode 内に配置するようにコード ジェネレーターに指示したため、生成されたクラス rtString は名前空間階層 allcode::notmycode 内で宣言されています。

type codegen/lib/foo/string1.h
//
// File: string1.h
//
// MATLAB Coder version            : 24.1
// C/C++ source code generated on  : 20-Apr-2024 06:06:03
//

#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]
//

参考

| |

関連するトピック