Main Content

coder.cinclude

生成コードにヘッダー ファイルをインクルードする

説明

coder.cinclude(headerfile) は生成された C/C++ ソース コードにヘッダー ファイルをインクルードします。

MATLAB® Coder™ は、coder.cinclude 呼び出しが含まれる MATLAB コードから生成される C/C++ ソース ファイルにインクルード ステートメントを生成します。

Simulink® モデルでは、coder.cinclude 呼び出しが MATLAB Function ブロックに存在する場合、コード ジェネレーターはインクルード ステートメントをモデルのヘッダー ファイルに配置します。

メモ

coder.cinclude 呼び出しを、可能な限りヘッダー ファイルが必要な coder.ceval 呼び出しの近くに配置します。

coder.cinclude(headerfile,'InAllSourceFiles',allfiles)allfiles オプションを使用してヘッダー ファイルをほとんどすべての C/C++ ソース ファイルにインクルードするかどうかを決定します。

allfilestrue のとき、MATLAB Coder は一部のユーティリティ ファイルを除いたほとんどすべての C/C++ ソース ファイルにインクルード ステートメントを生成します。この動作は R2016a 以前のリリースからの coder.cinclude の動作です。これらの追加ファイルにインクルード ステートメントがあることにより、コンパイル時間が増加し、生成されたコードの可読性が低下する可能性があります。このオプションは、コードがレガシ動作に依存する場合にのみ使用してください。allfilesfalse のときの動作は coder.cinclude(headerfile) と同じ動作になります。

MATLAB Function ブロック内では、coder.cinclude(headerfile,'InAllSourceFiles', allfiles)coder.cinclude(headerfile) と同じです。

すべて折りたたむ

外部 C 関数を呼び出す MATLAB 関数を使用してコードを生成します。coder.cinclude を使用して必要なヘッダー ファイルを生成された C コードにインクルードします。

書き込み可能なフォルダーにサブフォルダー mycfiles を作成します。

入力を 2 倍にする C 関数 myMult2.c を記述します。mycfiles に保存します。

#include "myMult2.h"
double myMult2(double u)
{
    return 2 * u;
}

ヘッダー ファイル myMult2.h を記述します。mycfiles に保存します。

#if !defined(MYMULT2)
#define MYMULT2
extern double myMult2(double);
#endif

myMult2.h をインクルードし、コード生成に対してのみ myMult2 を呼び出す MATLAB 関数 myfunc を記述します。

function y = myfunc
%#codegen
y = 21;
if ~coder.target('MATLAB')
    % Running in generated code
    coder.cinclude('myMult2.h');
    y = coder.ceval('myMult2', y);
else
    % Running in MATLAB
    y = y * 2;
end
end

スタティック ライブラリ用のコード構成オブジェクトを作成します。myMult2.hmyMult2.c の場所を指定します。

cfg = coder.config('lib');
cfg.CustomInclude = fullfile(pwd,'mycfiles');
cfg.CustomSource = fullfile(pwd,'mycfiles','myMult2.c');

コードを生成します。

codegen -config cfg myfunc -report

ファイル myfunc.c には次のステートメントが含まれます。

#include "myMult2.h"

インクルード ステートメントはその他のファイルにはありません。

外部 C 関数を呼び出す MATLAB Function ブロックからコードを生成します。coder.cinclude を使用して必要なヘッダー ファイルを生成された C コードにインクルードします。

書き込み可能なフォルダーにサブフォルダー mycfiles を作成します。

入力を 2 倍にする C 関数 myMult2.c を記述します。mycfiles に保存します。

#include "myMult2.h"
double myMult2(double u)
{
    return 2 * u;
}

ヘッダー ファイル myMult2.h を記述します。mycfiles に保存します。

#if !defined(MYMULT2)
#define MYMULT2
extern double myMult2(double);
#endif

Outport ブロックに接続された MATLAB Function ブロックが含まれる Simulink モデルを作成します。

This image shows a MATLAB Function block attached to an Outport block.

MATLAB Function ブロック内に、myMult2.h を含み、myMult2 を呼び出す関数 myfunc を追加します。

function y = myfunc
%#codegen
y = 21;
coder.cinclude('myMult2.h');
y = coder.ceval('myMult2', y);
% Specify the locations of myMult2.h and myMult2.c
coder.extrinsic('pwd', 'fullfile');
customDir = coder.const(fullfile(pwd, 'mycfiles'));
coder.updateBuildInfo('addIncludePaths', customDir);
coder.updateBuildInfo('addSourcePaths', customDir);
coder.updateBuildInfo('addSourceFiles', 'myMult2.c');
end

[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。

[ソルバー] ペインで固定ステップ ソルバーを選択します。

モデルを mymodel という名前で保存します。

モデルを作成します。

ファイル mymodel.h には次のステートメントが含まれます。

#include "myMult2.h"

MATLAB Function ブロックでカスタム コードを統合する方法の詳細については、MATLAB Function ブロックを使用した C コードの統合 (Simulink)を参照してください。

入力引数

すべて折りたたむ

文字ベクトルまたは string スカラーとして指定されるヘッダー ファイル名。headerfile はコンパイル時の定数でなければなりません。

システム ヘッダー ファイル名を山かっこ < > で囲みます。システム ヘッダー ファイルに対して生成された #include ステートメントの形式は #include <sysheader> になります。システム ヘッダー ファイルは標準の場所またはインクルード パス上になければなりません。コード生成のカスタム コード パラメーターを使用してインクルード パスを指定します。

例: coder.cinclude('<sysheader.h>')

システム ヘッダー ファイル以外のヘッダー ファイルについては、山かっこを省略します。システム ヘッダー ファイル以外のヘッダー ファイルに対して生成された #include ステートメントの形式は #include "myHeader" になります。ヘッダー ファイルは現在のフォルダーまたはインクルード パス上になければなりません。コード生成のカスタム コード パラメーターを使用してインクルード パスを指定します。

例: coder.cinclude('myheader.h')

データ型: char

生成されたすべての C/C++ ソース ファイルにヘッダー ファイルをインクルードするオプション。allfilestrue のとき、MATLAB Coder は一部のユーティリティ ファイルを除いたほとんどすべての C/C++ ソース ファイルにインクルード ステートメントを生成します。allfilesfalse のときの動作は coder.cinclude(headerfile) と同じ動作になります。

MATLAB Function ブロックでは、コード ジェネレーターはすべてのソース ファイル オプションを無視します。

データ型: logical

制限

  • 実行時の条件付き構成 (if ステートメント、switch ステートメント、while ループ、for ループなど) の内部で、関数 coder.cinclude を呼び出さないでください。コンパイル時の条件付きステートメント (関数 coder.target など) の内部では、coder.cinclude を呼び出すことができます。以下に例を示します。

    ...
     if ~coder.target('MATLAB')
       coder.cinclude('foo.h');
       coder.ceval('foo');
    end
    ...

ヒント

  • coder.ceval 呼び出しの前に、coder.cinclude を呼び出して coder.ceval が呼び出す外部関数に必要なヘッダー ファイルをインクルードします。

  • 生成された C/C++ コード内の不要なインクルード ステートメントにより、コンパイル時間が増加し、コードの可読性が低下する可能性があります。MATLAB Coder で生成されたコード内に不要なインクルード ステートメントが含まれないようにするには、以下のベスト プラクティスに従います。

    • coder.cinclude 呼び出しを、可能な限りヘッダー ファイルが必要な coder.ceval 呼び出しの近くに配置します。

    • allfilestrue に設定しないでください。

    MATLAB Function ブロックの場合、コード ジェネレーターはモデル ヘッダー ファイル内にインクルード ステートメントを生成します。

  • R2016a 以前のリリースでは、すべての coder.cinclude 呼び出しに対し、MATLAB Coder は一部のユーティリティ ファイルを除いて、生成されたほとんどすべての C/C++ ソース ファイルにヘッダー ファイルをインクルードしていました。このレガシ動作に依存するコードがある場合、次の構文を使用してレガシ動作を保持できます。

    coder.cinclude(headerfile,'InAllSourceFiles',true)

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。

バージョン履歴

R2013a で導入