将生成的c++代码组织到命名空间中
名称空间有助于将代码组织成逻辑部分,防止名称冲突,并使您能够更容易地将生成的c++代码集成到更大的c++项目中。名称空间还增加了对安全关键型代码的MISRA c++标准的遵从性。本主题解释如何使用代码生成设置将生成的c++代码的组织自定义为名称空间。
控制命名空间结构的设置
这些是代码生成设置,使您能够控制在生成的代码中创建名称空间:
代码配置参数 | 描述 | 如何指定 |
---|---|---|
在代码配置对象中: 在MATLAB®编码器™app:在代码的外观选项卡,c++名称空间 |
包含生成的c++代码的命名空间。 如果此参数为空,则代码生成器不会创建这样的名称空间。 |
在代码配置对象中: 在MATLAB编码器App:在文本框中指定 |
在代码配置对象中: 在MATLAB编码器app:在代码的外观选项卡,MathWorks函数的命名空间 |
命名空间,其中包含为所有MathWorks生成的代码®代码(例如,稀疏数据类型的代码)。 如果此参数为空,则代码生成器不会创建这样的名称空间。 |
在代码配置对象中: 在MATLAB编码器App:在文本框中指定 |
在代码配置对象中: 在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] //
另请参阅
编码器。CodeConfig
|编码器。EmbeddedCodeConfig
|编码器。MexCodeConfig