主要内容

将生成的c++代码组织到命名空间中

名称空间有助于将代码组织成逻辑部分,防止名称冲突,并使您能够更容易地将生成的c++代码集成到更大的c++项目中。名称空间还增加了对安全关键型代码的MISRA c++标准的遵从性。本主题解释如何使用代码生成设置将生成的c++代码的组织自定义为名称空间。

控制命名空间结构的设置

这些是代码生成设置,使您能够控制在生成的代码中创建名称空间:

代码配置参数 描述 如何指定

在代码配置对象中:CppNamespace

MATLAB®编码器™app:在代码的外观选项卡,c++名称空间

包含生成的c++代码的命名空间。

如果此参数为空,则代码生成器不会创建这样的名称空间。

在代码配置对象中:(默认)|字符向量

MATLAB编码器App:在文本框中指定

在代码配置对象中:CppNamespaceForMathworksCode

MATLAB编码器app:在代码的外观选项卡,MathWorks函数的命名空间

命名空间,其中包含为所有MathWorks生成的代码®代码(例如,稀疏数据类型的代码)。

如果此参数为空,则代码生成器不会创建这样的名称空间。

在代码配置对象中:“编码器”(默认)|字符向量

MATLAB编码器App:在文本框中指定

在代码配置对象中:CppPackagesToNamespaces

MATLAB编码器app:在代码的外观选项卡,MATLAB包到c++命名空间

是否在MATLAB代码中为包生成c++名称空间。

在代码配置对象中:真正的(默认)|

MATLAB编码器app:在代码的外观选项卡,选择或清除MATLAB包到c++命名空间复选框

关于命名空间生成的其他注意事项:

  • 当您指定CppNamespace属性(或应用程序中相应的设置),代码生成器将所有生成的函数和类型定义打包到命名空间中,但包含的泛型类型定义除外tmwtypes.h中特定于硬件的定义rtwtypes.h.示例主文件和函数没有打包到名称空间中。

  • 如果您的MATLAB代码有嵌套包(例如,pkg1内部pkg2这),生成的命名空间具有相同的嵌套。

  • 在为MATLAB代码创建用于代码生成的包时,请遵循以下指导原则:

    • 不要创建具有该名称的包“编码器”

    • 如果你设置CppNamespaceForMathworksCode属性(或应用程序中的等效参数)的非默认名称,不要创建具有该名称的包。

示例:生成带有名称空间的c++代码

这个例子展示了如何使用这些代码生成设置来创建名称空间。

定义MATLAB®函数

定义两个MATLAB函数喷火而且酒吧在两个单独的文件中foo.m而且bar.m.放置文件bar.m在一个包里myPackage.这个函数喷火接受字符串输入,然后调用函数酒吧

类型foo.m
函数out = foo(str) temp = strlength(str);Out = mypackage.bar(temp);结束
类型+ mypackage / bar.m
函数out = bar(in) code .inline('never');Out = in + 1;结束

定义代码配置对象

为静态库创建代码配置对象。将目标语言设置为c++。指定包含要命名的所有生成代码的名称空间allcode.指定包含要命名的MathWorks®代码的名称空间notmycode

CFG = code .config(“自由”);cfg。TargetLang =“c++”;cfg。CppNamespace =“allcode”;cfg。CppNamespaceForMathworksCode =“notmycode”

生成代码

生成一个静态c++库和一个代码生成报告。将输入类型指定为可以有任何长度的字符串标量。

T = code .typeof(“字符串”);t.StringLength = Inf;%设置t.StringLength为Inf会自动设置t.VariableStringLength为%真实codegen配置cfg喷火arg游戏{t}报告
要查看报告,打开('codegen/lib/foo/html/report.mldatx')

检查生成的代码

打开代码生成报告并检查生成的代码。

该文件foo。包含所生成函数的声明喷火.因为MATLAB函数喷火您创建的函数不在包中,生成的函数只在名称空间中声明allcode包含所有生成的代码。

类型codegen / lib / foo / foo
// //文件:foo.h // // MATLAB代码版本:5.5 // C/ c++源代码生成在:26- 11 -2022 05:47:51 // #ifndef FOO_H #定义FOO_H // Include Files # Include "rtwtypes.h" # Include "string1.h" # Include  # Include  //函数声明命名空间allcode {extern double foo(const notmycode::rtString *str);} #endif // // foo.h的文件预告片// // [EOF] //

该文件bar.h包含所生成函数的声明酒吧.因为你创建了MATLAB函数酒吧包装内部mypackage,生成的函数在命名空间层次结构中声明allcode: myPackage

类型codegen / lib / foo / bar.h
// // File: bar.h // // MATLAB Coder版本:5.5 // C/ c++源代码生成于:2022年11月26日05:47:51 // #ifndef BAR_H #define BAR_H // Include Files # Include "rtwtypes.h" # Include  # Include  //函数声明命名空间allcode{命名空间mypackage {double bar(double in);}} //命名空间allcode #endif // // bar.h的文件预告片// // [EOF] //

该文件string1.h包含所生成类的声明rtString实现MATLAB字符串数据类型。因为您指示代码生成器将为MathWorks代码生成的所有代码放置在名称空间中notmycode,生成的类rtString是否在名称空间层次结构中声明allcode: notmycode

类型codegen / lib / foo / string1.h
// // File: string1.h // // MATLAB Coder版本:5.5 // C/ c++源代码生成于:2022年11月26日05:47:51 // #ifndef STRING1_H #定义STRING1_H // Include Files # Include "rtwtypes.h" # Include "coder_array.h" # Include  # Include  //类型定义命名空间allcode{命名空间notmycode{类rtString{公共:void init(const:: Coder::array &b_Value);rtString ();~ rtString ();::coder::array值;};} // namespace notmycode} // namespace allcode #endif // // string1.h的文件预告// // [EOF] //

另请参阅

||

相关的话题