生成された C++ コードの名前空間への整理
名前空間を使用すると、コードを論理パーツに整理して名前の競合を防ぐことができ、生成された C++ コードをより大きな C++ プロジェクトに簡単に統合できるようになります。また、名前空間を使用すると、セーフティ クリティカルなコードの MISRA C++ 規格への準拠性が高まります。このトピックでは、コード生成設定を使用して、生成された C++ コードの名前空間への整理をカスタマイズする方法について説明します。
名前空間構造を制御する設定
生成コードでの名前空間の作成を制御できるコード生成設定は次のとおりです。
| コード構成パラメーター | 説明 | 指定方法 |
|---|---|---|
コード構成オブジェクトの場合: [コード生成設定] ダイアログ ボックスの場合: C++ 名前空間 | 生成された C++ コードを含む名前空間。 このパラメーターが空の場合、コード ジェネレーターはこのような名前空間を作成しません。 | コード構成オブジェクトの場合: [コード生成設定] ダイアログ ボックスの場合: テキスト フィールドで指定 |
コード構成オブジェクトの場合: [コード生成設定] ダイアログ ボックスの場合: MathWorks コードの名前空間 | すべての MathWorks® コードに対して生成されたコード (スパース データ型のコードなど) を含む名前空間。 このパラメーターが空の場合、コード ジェネレーターはこのような名前空間を作成しません。 | コード構成オブジェクトの場合: [コード生成設定] ダイアログ ボックスの場合: テキスト フィールドで指定 |
コード構成オブジェクトの場合: [コード生成設定] ダイアログ ボックスの場合: MATLAB 名前空間から C++ 名前空間を生成 | MATLAB® コード内の名前空間に対して C++ 名前空間を生成するかどうかを指定します。 | コード構成オブジェクトの場合: [コード生成設定] ダイアログ ボックスの場合: [MATLAB 名前空間から C++ 名前空間を生成] チェック ボックスをオンまたはオフにする |
名前空間の生成に関するその他のメモ:
CppNamespaceプロパティ (またはアプリの対応する設定) を指定すると、コード ジェネレーターは、生成されたすべての関数と型定義を名前空間にパッケージ化します (tmwtypes.hに含まれる汎用的な型定義およびrtwtypes.hにあるハードウェア固有の定義を除く)。この main ファイルの例と関数は、名前空間にパッケージ化されません。MATLAB コードに入れ子にされた名前空間がある場合 (
nmsp2内のnmsp1など)、生成されたコード内の名前空間は同じ入れ子構造になります。コード生成用の MATLAB コードの名前空間を作成する場合は、以下のガイドラインに従います。
'coder'という名前の名前空間は作成しないでください。CppNamespaceForMathworksCodeプロパティ (またはアプリの同等のパラメーター) を既定以外の名前に設定する場合、その名前の名前空間は作成しないでください。
例: C++ コードと名前空間の生成
この例では、以下のコード生成設定を使用して名前空間を作成する方法を示します。
MATLAB 関数の定義
2 つの MATLAB® 関数 addOne および callAddOne を 2 つの個別のファイル addOne.m および callAddOne.m で定義します。ファイル addOne.m を MATLAB 名前空間 myNamespace に配置します。関数 callAddOne は string 入力を受け入れ、関数 addOne を呼び出します。
type callAddOne.mfunction out = callAddOne(str) temp = strlength(str); out = myNamespace.addOne(temp); end
type +myNamespace/addOne.mfunction out = addOne(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 スカラーに指定します。string スカラーの StringLength プロパティを Inf に設定すると、string スカラーの VariableStringLength プロパティが自動的に true に設定されます。
t = coder.typeof("string"); t.StringLength = Inf; codegen -config cfg callAddOne -args {t} -report
Code generation successful: View report
生成されたコードの検証
コード生成レポートを開き、生成されたコードを検査します。
ファイル callAddOne.h には、生成された関数 callAddOne の宣言が含まれています。作成した MATLAB 関数 callAddOne は MATLAB 名前空間にないため、生成された関数は、生成コードを含む C++ 名前空間 allcode 内でのみ宣言されています。
type codegen/lib/callAddOne/callAddOne.h//
// File: callAddOne.h
//
// MATLAB Coder version : 25.1
// C/C++ source code generated on : 13-Jul-2025 16:34:35
//
#ifndef CALLADDONE_H
#define CALLADDONE_H
// Include Files
#include "rtwtypes.h"
#include "string1.h"
#include <cstddef>
#include <cstdlib>
// Function Declarations
namespace allcode {
extern double callAddOne(const notmycode::rtString *str);
}
#endif
//
// File trailer for callAddOne.h
//
// [EOF]
//
ファイル addOne.h には、生成された関数 addOne の宣言が含まれています。MATLAB 関数 addOne を MATLAB 名前空間 myNamespace 内に作成したため、生成された関数は C++ 名前空間階層 allcode::myNamespace 内で宣言されています。
type codegen/lib/callAddOne/addOne.h//
// File: addOne.h
//
// MATLAB Coder version : 25.1
// C/C++ source code generated on : 13-Jul-2025 16:34:35
//
#ifndef ADDONE_H
#define ADDONE_H
// Include Files
#include "rtwtypes.h"
#include <cstddef>
#include <cstdlib>
// Function Declarations
namespace allcode {
namespace myNamespace {
double addOne(double in);
}
} // namespace allcode
#endif
//
// File trailer for addOne.h
//
// [EOF]
//
ファイル string1.h には、MATLAB string データ型を実装する生成されたクラス rtString の宣言が含まれています。MathWorks コードに対して生成されたすべてのコードを名前空間 notmycode 内に配置するようにコード ジェネレーターに指示したため、生成されたクラス rtString は名前空間階層 allcode::notmycode 内で宣言されています。
type codegen/lib/callAddOne/string1.h//
// File: string1.h
//
// MATLAB Coder version : 25.1
// C/C++ source code generated on : 13-Jul-2025 16:34:35
//
#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]
//
参考
coder.CodeConfig | coder.EmbeddedCodeConfig | coder.MexCodeConfig