Main Content

MATLAB 类型映射到生成的代码中的类型

代码生成器在 C/C++ 中生成与您在 MATLAB® 代码中使用的数据类型对应的数据类型。生成的数据类型取决于目标平台和编译器。代码生成器既可以生成内置的 C 数据类型,如 shortlongint 等,也可以生成使用 C typedef 语句定义的自定义数据类型。默认情况下,代码生成器为独立代码(lib、dll 或 exe)生成内置类型,为 MEX 代码生成自定义类型。要使用内置 C 类型,请修改代码生成配置对象的 DataTypeReplacement 属性,或使用 MATLAB Coder™。有关详细信息,请参阅指定在生成的代码中使用的数据类型

为了生成自定义 C/C++ 类型,代码生成器会在头文件 tmwtypes.h 中使用预定义的数据类型,该头文件位于 fullfile(matlabroot,'extern','include')。代码生成器还可以基于对您的 MATLAB 代码的分析来生成自定义数据类型。自定义数据类型在位于代码生成目录中的文件 rtwtypes.hmyFunction_types.h 中定义。myFunction 是顶层函数的名称。代码生成器不能为 MATLAB 中存在的每种数据类型生成代码。请参阅 支持 C/C++ 代码生成的 MATLAB 语言功能

当您不使用内置 C 数据类型时,代码生成器会生成以下数据类型:

MATLAB 数据类型对应的自定义 C/C++ 数据类型
logicalboolean_T
charchar_T
stringrtString
int8int8_T
int16int16_T
int32int32_T
int64int64_T
uint8uint8_T
uint16uint16_T
uint32uint32_T
uint64uint64_T
singlereal32_T
doublereal_T
complex请参阅复数类型
struct请参阅结构体类型
fi请参阅定点类型

当按引用传递变量时,对应的自定义数据类型使用解引用运算符。例如,当按引用传递时,int8 对应的自定义 C/C++ 数据类型为 int8_T*

动态分配的数组映射到自定义 emxArray_ 类型。例如,动态分配的 char 数组将映射到 emxArray_char_T 类型。动态分配的双精度数组将映射到 emxArray_real_T 类型。例如,如果数组大小在编译时未知,或您使用 coder.varsize 创建了一个可变大小数组而没有指定显式上界,就会发生动态分配。有关可变大小数组的详细信息,请参阅在生成的函数接口中使用 C 数组

复数类型

在 MATLAB 中,复/实性定义为数据类型的属性。下表列出了代码生成器用于 MATLAB 复数数据类型的预定义数据类型。

MATLAB 复数数据类型对应的自定义 C/C++ 数据类型
int8cint8_T
int16cint16_T
int32cint32_T
int64cint64_T
uint8cuint8_T
uint16cuint16_T
uint32cuint32_T
uint64cuint64_T
singlecreal32_T
doublecreal_T

代码生成器将每个复数值定义为具有实部 re 和虚部 im 的结构体。有关示例,请参阅 tmwtypes.hcreal32_Ttypedef

typedef struct {
  real32_T re;/* Real component*/
  real32_T im;/* Imaginary component*/
} creal32_T;
假设您定义类型为 creal32_T 的变量 x。生成的代码以 x.re 形式访问实部,以 x.im 形式访问虚部。

如果您的 C/C++ 库需要不同的表示形式,您可以定义自己的 MATLAB Coder 复数类型版本,例如,通过使用 coder.cstructname 来定义。但是,在您的定义中,您必须对实部使用名称 re,对虚部使用名称 im

有关详细信息,请参阅复数数据的代码生成

结构体类型

MATLAB Coder 以逐字段方式将结构体映射到 C/C++ 类型。MATLAB 定义中的结构体字段的顺序保持不变。要控制生成的 C/C++ 结构体类型的名称,或提供定义,请使用 coder.cstructname 函数。如果不使用动态内存分配,结构体中的数组将转换为一维数组,而不是指针。有关详细信息,请参阅结构体

定点类型

fi 对象的 numerictype 属性确定其 C/C++ 数据类型。默认情况下,代码生成器尝试使用内置 C/C++ 类型。但是,您可以选择改用自定义 C/C++ 数据类型。下表显示 SignednessWordLengthFractionLength 属性如何确定自定义 C/C++ 数据类型。自定义 C/C++ 数据类型是根据其字长选择的下一个更大的目标字长,该字长能够存储定点值。整数类型的符号与定点类型的符号匹配。

符号性字长小数长度对应的自定义 C/C++ 数据类型
187int8_T
1 1310int16_T
11615int16_T
01915uint32_T

字符向量

MATLAB Coder 软件将 MATLAB 字符向量映射到 C/C++ 字符数组。这些字符数组不是 C/C++ 字符串,因为它们不以空值结尾。如果您将 MATLAB 字符向量传递给需要 C/C++ 字符串的外部 C/C++ 代码,则生成的 C/C++ 字符数组必须以空值结尾。要生成以空值结尾的 C/C++ 字符数组,请在 MATLAB 字符向量的末尾追加零。例如,['sample text' 0]。否则,生成的需要字符串的代码可能会停止工作,而不会抛出编译器错误或警告。

多字类型

多字类型是当目标硬件无法以内置 C/C++ 类型存储您的 MATLAB 数据类型时生成的自定义类型。多字类型生成为包含整数数组的 C/C++ 结构体类型。数组维数取决于目标硬件上最宽整数类型的大小。

例如,对于 128 位定点类型,如果目标硬件上最宽的整数类型是 32 位,软件将生成一个结构体,该结构体包含一个由四个 32 位整数组成的数组。

typedef struct
{
  unsigned int  chunks[4];
} uint128m_T;

如果目标硬件上最宽的整数类型是大小为 64 位的 long 类型,代码生成器将生成一个结构体,该结构体包含一个由两个 64 位长类型组成的数组。

typedef struct
{
  unsigned long chunks[2];
} uint128m_T;

从 64 位整数 MATLAB 类型生成的 C/C++ 数据类型取决于目标硬件上整数类型的大小。如果宽度足以存储 64 位的内置类型不存在,则 64 位 MATLAB Coder 类型将映射到自定义多字类型。

另请参阅

|

相关主题