如何配置clang-format禁止结构体数组元素单行显示
问题
我正在配置.clang-format文件,大部分设置正常,但遇到一个小问题:
格式化这段C代码时:
struct testStruct data[] = { {.a = 0, .b = 0}, {.a = 0, .b = 0}, };
输出会把每个结构体元素合并成单行:
struct testStruct data[] = { {.a = 0, .b = 0}, {.a = 0, .b = 0}, };
如果在每个结构体内部的最后一个元素后添加逗号,格式化结果就会变成多行展开:
struct testStruct data[] = { { .a = 0, .b = 0, }, { .a = 0, .b = 0, }, };
我知道单独初始化每个结构体是一种临时解决办法:
struct testStruct data[]; data[0] = { .a = 0, .b = 0, }
但我想知道是哪个配置项控制这种格式化行为?我猜测是AllowShortBlocksOnASingleLine,但相关配置项太多了。我的当前配置如下:
--- BasedOnStyle: Microsoft IndentWidth: 4 UseTab: Never LineEnding: DeriveLF MaxEmptyLinesToKeep: 2 # for me, 2 empty lines were so common. # Sorry Linux... But we need some C++ stuff here. BreakBeforeBraces: Custom BraceWrapping: AfterCaseLabel: false AfterClass: true AfterControlStatement: MultiLine AfterEnum: false AfterFunction: true AfterNamespace: false AfterStruct: false AfterUnion: false AfterExternBlock: false BeforeCatch: false BeforeElse: false BeforeWhile: false # BreakBeforeBraces End AllowShortBlocksOnASingleLine: Never AllowShortIfStatementsOnASingleLine: Never IndentCaseLabels: false IndentPPDirectives: BeforeHash IncludeBlocks: Preserve # because google c++ guide specifies the order of #include blocks. SortIncludes: CaseInsensitive ColumnLimit: 120 # same as Microsoft, don't ask me, I just think it's great. InsertNewlineAtEOF: true # Who doesn't like \n in the file end. BinPackParameters: true # Microsoft has set this, but I also saw this config. AlignAfterOpenBracket: Align # TBD, now same as Microsoft. AlignTrailingComments: Kind: Always OverEmptyLines: 0 AlignOperands: AlignAfterOperator AlignEscapedNewlines: DontAlign ...
解决办法
控制这种结构体初始化格式的核心配置是AllowShortStructuresOnASingleLine——你当前的配置没有显式设置它,会继承Microsoft风格的默认值(通常为true),所以clang-format会把短结构体初始化合并成单行。
至于添加尾逗号后格式自动展开的情况,是因为clang-format对带尾逗号的集合/结构体初始化有特殊处理逻辑:它会判定你希望将内容展开为多行,这同时也和BinPackStructures配置有关(默认通常为true,允许打包结构体成员,但尾逗号会覆盖这个行为)。
如果想要实现“即使没有尾逗号,结构体初始化也保持多行”的效果,只需在配置中添加以下两项:
AllowShortStructuresOnASingleLine: Never BinPackStructures: false
AllowShortStructuresOnASingleLine: Never:强制短结构体初始化不合并为单行BinPackStructures: false:禁止将结构体成员打包到同一行,确保每个成员单独占一行
补充:你之前猜测的AllowShortBlocksOnASingleLine是控制代码语句块(比如{}包裹的逻辑块)的,和结构体初始化无关,所以对这个场景不起作用。
内容的提问来源于stack exchange,提问作者酸柠檬猹
相关产品推荐
相关产品推荐

