matlab编码器 - 在创建的C代码中更改格式

时间:2018-06-18 04:09:22

标签: format matlab-coder

我使用Matlab编码器将代码移植到C,例如对于下一个功能:

function sum_out = my_sum( x )
sum_out = 0;
for i=1:size(x,1)
    sum_out = sum_out + x(i);
end
end 

生成的C代码是:

double my_sum(const double x[10])
{
  double sum_out;
  int i;
  sum_out = 0.0;
  for (i = 0; i < 10; i++) {
    sum_out += x[i];
  }
  return sum_out;
}

有没有办法让缩进4个空格?

另外,我想将大括号括在一个单独的行中。

1 个答案:

答案 0 :(得分:1)

如果你有嵌入式编码器,配置设置IndentSizeIndentStyle可以让你调整你所要求的行为:

https://www.mathworks.com/help/coder/ref/coder.embeddedcodeconfig.html?s_tid=doc_ta

更一般地说,如果您正在寻找对生成代码格式的进一步自定义,您可以考虑在其上运行外部代码格式设置工具,如clang-format

答案:

https://www.mathworks.com/matlabcentral/answers/391533-is-there-a-way-to-disable-line-wrapping-in-generated-c-code-from-matlab-coder

显示了如何实现自动化。为了完整起见,我将重现这里的步骤。

编码器配置设置PostCodeGenCommand允许您在代码生成完成之后但在C / C ++编译器运行之前运行一些MATLAB代码。因此,您可以使用它来调用clang-format

  • 制作文件doclangformat.m

    function doclangformat(buildInfo)
    sourceFiles = join(buildInfo.getSourceFiles(true,true));
    sourceFiles = sourceFiles{1};
    cmd = ['clang-format -i -style=''{BasedOnStyle: LLVM, ColumnLimit: 20}'' ' sourceFiles]; 
    system(cmd);
    

    我已将ColumnLimit设置为20,因此效果显而易见。代码将被彻底包装。您可以在clang-format documentation

  • 中查看其他选项
  • 设置配置对象并调用codegen

    cfg = coder.config('lib');
    cfg.PostCodeGenCommand = 'doclangformat(buildInfo)';
    codegen foo -config cfg <other codegen args>
    

现在您应该看到您的代码被包装到大约20列。

这种方法的主要缺点是需要在IndentStyle规范中指定其他编码器样式设置,如IndentSizeclang-format等。