我有一个关于C++编译器的clang格式问题。我注意到在升级到Clang-Format 15.0.1后,简短但不在线的编译器有了新的行为。我在下面称之为“两行编译器”。示例:
- 一行双床间**
// good/unchanged
auto shortLambda= []() { doSomething(); };
字符串
两行字符串:
// unwanted/new behavior
const auto mediumLambda = [some, args, here](More arguments)
{ return doSomething(some, args, here, arguments); };
型
多行Lambdas:
// good/unchanged
const auto longLambda= [some, args, here](Are here)
{
auto result =doSomething(some, args, here, arguments);
return result;
};
型
两行队列的期望行为:
// desired
const auto mediumLambda = [some, args, here](More arguments)
{
return doSomething(some, args, here, arguments);
};
型
理性:“两行”,如果语句没有在两行上挤在一起
// Good/unchanged
if (condition)
{
doWhatever();
}
// Bad/unconfigured:
if (condition)
{ doWhatever(); }
型
我可以通过设置AllowShortLambdasOnASingleLine : None
使所有的多行文件都是多行的--但是我确实希望那些可以放在一行上的文件可以放在一行上。
我如何避免“两行重叠”?
相关配置:
# Basic
Language : Cpp
Standard : c++20
ColumnLimit : '110'
# Tabs
TabWidth : '3'
IndentWidth : '3'
UseTab : Never
# Braces/Parens (Allman style)
BreakBeforeBraces : Custom
BraceWrapping:
AfterCaseLabel: true
AfterClass: true
AfterControlStatement: true
AfterEnum: true
AfterFunction: true
AfterNamespace: true
AfterObjCDeclaration: true
AfterStruct: true
AfterUnion: true
AfterExternBlock: true
BeforeCatch: true
BeforeElse: true
BeforeLambdaBody: true
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
Cpp11BracedListStyle : true
SpaceBeforeParens : ControlStatements
SpacesInParentheses : false
SpaceInEmptyParentheses : false
# Functions
AlignAfterOpenBracket : Align
AllowShortBlocksOnASingleLine : false
AllowShortFunctionsOnASingleLine : Inline
BinPackArguments : true
BinPackParameters : true
AllowAllParametersOfDeclarationOnNextLine : true
IndentWrappedFunctionNames : false
AlwaysBreakAfterReturnType : None
AlwaysBreakAfterDefinitionReturnType : None
# Lambdas
AllowShortLambdasOnASingleLine : All
型
编辑:添加了一些使C++有效的函数。
1条答案
按热度按时间5ssjco0h1#
恐怕这是不可能的。如果让我猜的话,该工具首先检查您是否允许短的字符串,然后注意到它不适合在一行中,所以它应用
BraceWrapping: BeforeLambdaBody
并满足,因为现在所有内容都在列限制之内。如果在这种情况下可以牺牲Allman的风格,则将
BraceWrapping: BeforeLambdaBody
设置为false
将导致字符串
同时在一行中保持短的双引号,如果不可能保持在一行中,则断开结尾
};
。它可能是一个bug,也可能不是,但它肯定值得填写一个bug票据来改变这种行为或改进文档,解释该工具在这种特定情况下的作用。