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

matlab coder - change format in created C code

我正在使用 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个空格?

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

如果您有 Embedded Coder,配置设置 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 列。

这种方法的主要缺点是需要在您的 clang-format 规范中指定其他 Coder 样式设置,如 IndentStyleIndentSize 等。