Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

MATLAB Coder アプリの場合: [コード外観] タブの [MATLAB パッケージを C++ 名前空間に変換]

MATLAB コード内のパッケージに対応する C++ 名前空間を生成するかどうか。

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

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

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

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

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

  • コード生成用の MATLAB コードのパッケージを作成する場合は、以下のガイドラインに従います。

    • 'coder' という名前のパッケージは作成しないでください。

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

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

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

MATLAB® 関数の定義

2 つの MATLAB 関数 foo および bar を 2 つの個別のファイル foo.m および bar.m で定義します。ファイル bar.m をパッケージ myPackage に配置します。関数 foo は string 入力を受け入れ、関数 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++ スタティック ライブラリとコード生成レポートを生成します。入力型を、任意の長さにすることができる string スカラーに指定します。

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  : 04-Jun-2021 23:20:10
//

#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  : 04-Jun-2021 23:20:10
//

#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 には、MATLAB string データ型を実装する生成されたクラス rtString の宣言が含まれています。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  : 04-Jun-2021 23:20:10
//

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

参考

| |

関連するトピック