clang-format:如何对齐结构初始化列表

clang-format: How to align list of struct inits

我有一个结构数组:
(假设标识符在其他地方是 #defined...)

typedef struct
{
    int a;
    char id[2+1];
} T;

const T T_list[] = {
    { PRIO_HOUSE, "HI" },
    { PRIO_SOMETHING_ELSE, "WO" }
    // ...
}

我想要 clang-format 格式化成这样:

const T T_list[] = {
    { PRIO_HOUSE         , "HI" },
    { PRIO_SOMETHING_ELSE, "WO" }
    // ...
}

可能吗?

我已经阅读了文档,但在这方面我没有找到任何有用的东西。 https://clang.llvm.org/docs/ClangFormatStyleOptions.html

这是我的.clang-format

---
BasedOnStyle: WebKit
BreakBeforeBraces: Allman
BraceWrapping:
  AfterEnum: false  
IndentCaseLabels: 'true'
AlignConsecutiveAssignments: 'true'
AlignConsecutiveDeclarations: 'true'
AlignEscapedNewlines: 'true'
AlignTrailingComments: 'true'
AllowShortFunctionsOnASingleLine: 'false'
#...

没有。 clang-format 不能这样做。

我的做法是:

  1. 使用第三方工具对齐
  2. 格式化区域前放://clang-format off
  3. 在格式化区域后放://clang-format on

如果您想要垂直对齐,则可以在使用初始化列表时使用尾随逗号来实现。

之前

    const T T_list[] = { { PRIO_HOUSE, "HI" }, { PRIO_SOMETHING_ELSE, "WO" } };

之后

    const T T_list[] = {
        { PRIO_HOUSE, "HI" },
        { PRIO_SOMETHING_ELSE, "WO" }, // <-- notice the comma here
    };

如果您还想对齐声明,我不确定您会怎么做。但尾随逗号是第 1 步。

从 clang-format 版本 13 (2021) 开始,有一个新的 AlignArrayOfStructures 选项可以做到这一点。从问题中链接的现在更新的文档中:

AlignArrayOfStructures (ArrayInitializerAlignmentStyle) clang-format 13

if not None, when using initialization for an array of structs aligns the >fields into columns.

以及 AlignArrayOfStructures: Left 的示例:

struct test demo[] =
{
   {56, 23,    "hello"},
   {-1, 93463, "world"},
   {7,  5,     "!!"   }
};