Clang Format 14在含后置参数的内联Lambda调用中错误换行
解决clang-format-14中Lambda作为函数参数时的无端换行问题
使用clang-format-14时遇到异常行为:当内联Lambda作为函数参数传递,且Lambda后还有其他参数时,工具会为函数调用行添加换行,但该行长度并未超过设置的ColumnLimit。
原始C++示例
#include <functional> void foo(int x, const std::function<void()>&f) { f(); } void bar(int x, const std::function<void()>& f, int y) { f(); } int main() { foo(0, []() {}); bar(0, []() {}, 0); }
clang-format格式化后的代码
#include <functional> void foo(int x, const std::function<void()>& f) { f(); } void bar(int x, const std::function<void()>& f, int y) { f(); } int main() { foo(0, []() {}); bar( 0, []() {}, 0); }
当前.clang-format配置(clang-format 14.0.6)
IndentWidth: 4 TabWidth: 4 ColumnLimit: 95 UseTab: Always BreakBeforeBraces: Attach AllowShortEnumsOnASingleLine: false AllowShortIfStatementsOnASingleLine: false AllowShortFunctionsOnASingleLine: Empty AccessModifierOffset: -4 IncludeBlocks: Regroup IncludeCategories: - Regex: "\"+.+\"" Priority: 1 - Regex: "<[^/]+>" Priority: 2 - Regex: "<.+(?:\\.h|\\.hpp)>" Priority: 3 IndentCaseLabels: true PointerAlignment: Left AlwaysBreakTemplateDeclarations: Yes
解决方案
在.clang-format配置中添加以下任一配置项,即可解决该无端换行问题:
方案1:强制函数调用左括号与函数名同行
添加BreakBeforeCallParentheses: Never,覆盖clang-format默认的换行逻辑:
BreakBeforeCallParentheses: Never
方案2:允许所有短调用保持单行
添加AllowShortCallsOnASingleLine: Always,让符合行长度要求的函数调用强制留在单行:
AllowShortCallsOnASingleLine: Always
该问题源于clang-format 14对包含Lambda且后续还有参数的函数调用的默认格式化规则,上述两个配置项均可覆盖该行为,确保行长度合规的代码保持紧凑格式。
内容的提问来源于stack exchange,提问作者a.deshpande012
相关产品推荐
相关产品推荐

