このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
生成された C++ コードの名前空間への整理
名前空間を使用すると、コードを論理パーツに整理して名前の競合を防ぐことができ、生成された C++ コードをより大きな C++ プロジェクトに簡単に統合できるようになります。また、名前空間を使用すると、セーフティ クリティカルなコードの MISRA C++ 規格への準拠性が高まります。このトピックでは、コード生成設定を使用して、生成された C++ コードの名前空間への整理をカスタマイズする方法について説明します。
名前空間構造を制御する設定
生成コードでの名前空間の作成を制御できるコード生成設定は次のとおりです。
コード構成パラメーター | 説明 | 指定方法 |
---|---|---|
コード構成オブジェクトの場合: MATLAB® Coder™ アプリの場合: [コード外観] タブの [C++ 名前空間] | 生成された C++ コードを含む名前空間。 このパラメーターが空の場合、コード ジェネレーターはこのような名前空間を作成しません。 | コード構成オブジェクトの場合: MATLAB Coder アプリの場合: テキスト フィールドで指定 |
コード構成オブジェクトの場合: MATLAB Coder アプリの場合: [コード外観] タブの [MathWorks コードの名前空間] | すべての MathWorks® コードに対して生成されたコード (スパース データ型のコードなど) を含む名前空間。 このパラメーターが空の場合、コード ジェネレーターはこのような名前空間を作成しません。 | コード構成オブジェクトの場合: MATLAB Coder アプリの場合: テキスト フィールドで指定 |
コード構成オブジェクトの場合: MATLAB Coder アプリの場合: [コード外観] タブの [MATLAB 名前空間から C++ 名前空間を生成] | MATLAB コード内の名前空間に対して C++ 名前空間を生成するかどうかを指定します。 | コード構成オブジェクトの場合: 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] //
参考
coder.CodeConfig
| coder.EmbeddedCodeConfig
| coder.MexCodeConfig