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"-headerfile" 选项结合使用,而不是使用 coder.cinclude。仅在使用 coder.ceval 调用在同一个头文件中定义的多个 C/C++ 函数时,才使用 coder.cinclude。您必须在对应的 coder.ceval 调用之前调用 coder.cinclude,并且必须在同一 MATLAB 函数中调用 coder.cincludecoder.ceval

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 模块。

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)

输入参数

全部折叠

指定为字符向量或字符串标量的头文件的名称。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)

扩展功能

C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。

GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。

版本历史记录

在 R2013a 中推出