【问题标题】:clang-format array initialiser over multiple lines?多行的clang格式数组初始化器?
【发布时间】:2021-07-20 12:25:20
【问题描述】:

我希望能够编写以下代码:

float positions[] =
{
    -0.5f, -0.5f,
     0.5f, -0.5f,
     0.5f,  0.5f,
    -0.5f,  0.5f
};

但是 clang-format 不断将初始化程序格式化为超过一行。

如上所述,我找不到允许它们超过一行或多行的设置。 This 问题类似,但没有解决我的问题,因为它假定引擎允许多行初始化。

我缺少什么设置?我浏览了选项,但似乎找不到。

【问题讨论】:

  • 除非你的线宽很窄,只能容纳-0.5f, -0.5f,据我所知,恐怕用clang-format是不可能的。也就是说,您可以选择每行有一个参数,也可以选择几个参数一起填充该行,但 clang-format 不允许您仅填充该行的一部分。供您参考,请参阅BinPackArguments 选项。
  • @aafulei 有什么方法可以禁用数组初始化器等的这种格式设置吗?
  • 要暂时关闭 clang-format,请将具体代码放在这两条注释行之间:// clang-format off//clang-format on 告诉 clang-format 不要触及该部分。
  • @aafulei 并且没有办法让 clang-format 不通过每次添加此评论来全局格式化数组初始化器?
  • @aafulei 我不同意,如果我可以做一些诸如“AllowAllConstructorInitializersOnNextLine”之类的事情,我觉得可以为初始化列表对齐提供类似的选项。无论如何

标签: c++ clang-format


【解决方案1】:

从格式化程序的角度来看,您的安排没有任何意义。您有一个初始化列表并要求格式化程序将其排列在每行两个元素中。但是初始化列表没有语义,甚至没有任何东西可以远程暗示它的元素是成对相关的。

如果您的元素应该分成两组,那么您很可能需要将它们实际“分组”在一个有意义的结构中。这不仅是为了格式化,而且首先是为了代码的完整性。例如:

struct Point { float x; float y; };

Point positions[] =
{
    {-0.5f, -0.5f},
    {0.5f, -0.5f},
    {0.5f,  0.5f},
    {-0.5f,  0.5f}
};

我也强烈建议停止使用 C 数组。使用std::vectorstd::array

struct Point { float x; float y; };

std::array<Point, 4> positions =
{{
    {-0.5f, -0.5f},
    {0.5f, -0.5f},
    {0.5f,  0.5f},
    {-0.5f,  0.5f}
}};

【讨论】:

  • 这可能是我在实际代码库中会做的事情,但我实际上正在学习教程,所以这是出于教育目的,我仍然希望能够禁用数组格式,但是你所说的肯定是有道理的——我不确定我是否真的遇到了这个问题。我通常会使用 std::array。
【解决方案2】:

这可以通过在clang-format off/on 注释中包装代码来解决。 clang-format 将其格式化为一行,但如果您想暂时禁用 clang-format,您可以这样做:

// clang-format off
float positions[] =
{
    -0.5f, -0.5f,
     0.5f, -0.5f,
     0.5f,  0.5f,
    -0.5f,  0.5f
};
// clang-format on

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 2021-05-15
    • 2021-06-03
    • 2013-06-20
    • 1970-01-01
    • 2021-04-15
    • 2021-03-09
    • 2012-09-02
    • 2020-05-04
    相关资源
    最近更新 更多