clang-format 堆栈所有 if 语句参数(如果它们太长)
Posted
技术标签:
【中文标题】clang-format 堆栈所有 if 语句参数(如果它们太长)【英文标题】:clang-format stack all if-statement arguments if they are too long 【发布时间】:2018-11-23 07:59:50 【问题描述】:我有一个 if
语句,它有几个 or
ed 参数。为了便于阅读,我将它们垂直堆叠如下。
if (health.flag_a ||
health.flag_b ||
health.flag_c ||
health.flag_d ||
health.flag_e ||
health.flag_f ||
health.flag_g ||
health.flag_h ||
health.flag_i ||
health.flag_k)
do_something();
return false;
clang-format
将其转换为:
if (health.flag_a || health.flag_b || health.flag_c || health.flag_d || health.flag_e || health.flag_f || health.flag_g || health.flag_h ||
health.flag_i || health.flag_k)
do_something();
return false;
如果它们不适合一行,我希望clang-format
像上面那样堆叠它们。
我希望BinPackArguments
这样做,但我没有运气。
这可以实现吗?
请在下方查看我的.clang-format
。
感谢您的帮助。
---
Language: Cpp
# BasedOnStyle: Google
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: true
AlignConsecutiveDeclarations: true
AlignEscapedNewlinesLeft: false
AlignOperands: true
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Inline
AllowShortIfStatementsOnASingleLine: true
AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: true
BinPackArguments: false
BinPackParameters: false
BraceWrapping:
AfterClass: false
AfterControlStatement: false
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
ColumnLimit: 145
CommentPragmas: '^ IWYU pragma:'
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: true
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
IncludeCategories:
- Regex: '^<.*\.h>'
Priority: 1
- Regex: '^<.*'
Priority: 2
- Regex: '.*'
Priority: 3
IndentCaseLabels: true
IndentWidth: 4
IndentWrappedFunctionNames: false
KeepEmptyLinesAtTheStartOfBlocks: false
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: false
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
PointerAlignment: Left
ReflowComments: true
SortIncludes: true
SpaceAfterCStyleCast: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Auto
TabWidth: 4
UseTab: ForIndentation
...
【问题讨论】:
【参考方案1】:不是直接的,但您可以使用BreakBeforeBinaryOperators
实现类似的效果。尝试将此值设置为NonAssignment
。这会将您的||
运算符放在每个附加条件之前之前,但不是在它们之后。
【讨论】:
条件没问题之前有||
,我关心的是条件叠加。您的建议与BinPackArguments: false
一起是一种改进。不幸的是,它只会堆叠不适合第一行的条件。第一行还有几个。我认为BinPack*
应该这样做。
BinPack*
用于函数的参数和参数。我不认为它着眼于分支语句中的条件。
不幸的是,情况似乎如此。【参考方案2】:
我发现的唯一解决方案是 // clang-format off
和 // clang-format on
cmets 的使用对。例如
// clang-format off
if (health.flag_a ||
health.flag_b ||
health.flag_c ||
health.flag_d ||
health.flag_e ||
health.flag_f ||
health.flag_g ||
health.flag_h ||
health.flag_i ||
health.flag_k)
do_something();
return false;
// clang-format on
是的,这根本不是解决方案,但至少它可以防止您的堆叠条件被 clang-format
重新格式化。
【讨论】:
以上是关于clang-format 堆栈所有 if 语句参数(如果它们太长)的主要内容,如果未能解决你的问题,请参考以下文章
防止 clang-format 将多行 if 语句折叠成一行