Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

coder.cinclude

在生成的代码中包括头文件

说明

示例

coder.cinclude(headerfile) 在生成的 C/C++ 源代码中包含头文件。

MATLAB® Coder™ 在从包含 coder.cinclude 调用的 MATLAB 代码生成的 C/C++ 源文件中生成 include 语句。

在 Simulink® 模型中,当 MATLAB Function 模块中出现 coder.cinclude 调用时,代码生成器会将 include 语句放在模型头文件中。

注意

尽可能靠近需要头文件的 coder.ceval 调用来放置 coder.cinclude 调用。

coder.cinclude(headerfile,'InAllSourceFiles',allfiles) 使用 allfiles 选项确定是否在几乎所有 C/C++ 源文件中包含头文件。

如果 allfilestrue,则 MATLAB Coder 在几乎所有 C/C++ 源文件中生成 include 语句,但一些实用工具文件除外。此行为是 R2016a 及更早版本中的 coder.cinclude 行为。这些附加文件中如果存在 include 语句,会使编译时间增加并使生成的代码的可读性降低。仅当代码依赖于旧行为时,才使用此选项。如果 allfilesfalse,则行为与 coder.cinclude(headerfile) 的行为相同。

MATLAB Function 模块中,coder.cinclude(headerfile,'InAllSourceFiles', allfiles)coder.cinclude(headerfile) 相同。

示例

全部折叠

从调用外部 C 函数的 MATLAB 函数中生成代码。使用 coder.cinclude 将所需头文件包含在生成的 C 代码中。

在可写文件夹中,创建子文件夹 mycfiles

编写一个使输入翻倍的 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

编写 MATLAB 函数 myfunc,该函数包含 myMult2.h 并且仅为代码生成调用 myMult2

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"

该 include 语句不会出现在任何其他文件中。

从调用外部 C 函数的 MATLAB Function 模块中生成代码。使用 coder.cinclude 将所需头文件包含在生成的 C 代码中。

在可写文件夹中,创建子文件夹 mycfiles

编写一个使输入翻倍的 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

创建一个包含 MATLAB Function 模块的 Simulink 模型,该模块连接到 Outport 模块。

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

打开 Configuration Parameters 对话框。

Solver 窗格上,选择固定步长求解器。

将模型另存为 mymodel

编译模型。

文件 mymodel.h 包含以下语句:

#include "myMult2.h"

要阅读有关在 MATLAB Function 模块中集成自定义代码的详细信息,请参阅使用 MATLAB Function 模块集成 C 代码 (Simulink)

输入参数

全部折叠

指定为字符向量或字符串标量的头文件的名称。headerfile 必须为编译时常量。

使用尖括号 < > 将系统头文件名称括起来。为系统头文件生成的 #include 语句的格式为 #include <sysheader>。系统头文件必须位于标准位置或包含路径中。通过使用代码生成自定义代码参数来指定包含路径。

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

对于不是系统头文件的头文件,省略尖括号。对于不是系统头文件的头文件,生成的 #include 语句的格式为 #include "myHeader"。头文件必须位于当前文件夹或包含路径中。通过使用代码生成自定义代码参数来指定包含路径。

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

数据类型: char

在所有生成的 C/C++ 源文件中包含头文件的选项。如果 allfilestrue,则 MATLAB Coder 在几乎所有 C/C++ 源文件中生成 include 语句,但一些实用工具文件除外。如果 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++ 代码中的外部 include 语句会增加编译时间并降低代码可读性。为避免 MATLAB Coder 生成的代码中出现外部 include 语句,请遵循以下最佳做法:

    • 尽可能靠近需要头文件的 coder.ceval 调用来放置 coder.cinclude 调用。

    • 不要将 allfiles 设置为 true

    对于 MATLAB Function 模块,代码生成器在模型头文件中生成 include 语句。

  • 在 R2016a 及更早版本中,对于任何 coder.cinclude 调用,MATLAB Coder 都会在几乎所有生成的 C/C++ 源文件中包含头文件,但一些实用工具文件除外。如果您的代码依赖于此旧有行为,可以使用以下语法保留旧行为:

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

在 R2013a 中推出