clang-format配置短lambda单行后仍拆分含花括号初始化lambda问题
背后原理
clang-format对两种初始化形式的处理差异来自词法分析阶段的优先级判定规则:
- 针对
Output(1, 2)的圆括号构造形式,clang-format将其识别为普通函数调用类表达式,只要符合配置的短lambda、短块单行规则,且总长度不超过列宽限制,就会将整个lambda体合并为单行,后续参数按AlignAfterOpenBracket: Align规则对齐到开括号位置排版,也就是你看到的something2的格式。 - 针对
Output{1, 2}的花括号列表初始化形式,clang-format默认会将{标记为高优先级的换行触发点:在默认Cpp11BracedListStyle: true的配置下,列表初始化的花括号会被判定为类似代码块的边界,哪怕开启了所有短结构单行的配置,16及更早版本的clang-format也不会将"lambda体内仅包含带花括号初始化的返回语句"的场景判定为可合并的短lambda,因此会强制拆分lambda体为多行,最终呈现something1的换行排版。
简单说就是默认规则下,花括号的换行权重远高于圆括号,列表初始化的花括号没有被纳入短lambda单行判定的豁免范围,才导致两种写法排版不一致。
配置方案
在你现有配置的基础上新增Cpp11BracedListStyle: false即可,完整配置如下:
AlignAfterOpenBracket: Align AllowShortBlocksOnASingleLine: Always AllowShortFunctionsOnASingleLine: All AllowShortLambdasOnASingleLine: All Cpp11BracedListStyle: false # 可选,保持花括号初始化前无空格,即Output{1,2}而非Output {1,2} SpaceBeforeCpp11BracedList: false
该配置会关闭clang-format对C++11花括号列表的特殊换行判定逻辑,将花括号初始化和圆括号初始化做同等权重的排版判断,最终something1会和something2完全一致,输出为lambda单行、参数对齐到开括号的格式。
如果你使用的是15及更早版本的clang-format,额外添加一行PenaltyBreakBracedList: 0降低花括号列表的换行惩罚值即可达到同样效果。
内容的提问来源于stack exchange,提问作者digitalPhonix
相关产品推荐
相关产品推荐

