c++ 如何防止短的重复被分成两行?

nxagd54h  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(142)

我有一个关于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++有效的函数。

5ssjco0h

5ssjco0h1#

恐怕这是不可能的。如果让我猜的话,该工具首先检查您是否允许短的字符串,然后注意到它不适合在一行中,所以它应用BraceWrapping: BeforeLambdaBody并满足,因为现在所有内容都在列限制之内。
如果在这种情况下可以牺牲Allman的风格,则将BraceWrapping: BeforeLambdaBody设置为false将导致

const auto mediumLambda = [some, args, here](More arguments) { 
    return doSomething(some, args, here, arguments); 
};

字符串
同时在一行中保持短的双引号,如果不可能保持在一行中,则断开结尾};
它可能是一个bug,也可能不是,但它肯定值得填写一个bug票据来改变这种行为或改进文档,解释该工具在这种特定情况下的作用。

相关问题