【问题标题】:clang-format BinPackArguments not working as expectedclang-format BinPackArguments 未按预期工作
【发布时间】:2015-05-05 15:44:15
【问题描述】:

clang-format 有 2 个选项,称为 BinPackParametersBinPackArguments。它们似乎控制函数声明和函数调用的缩进方式。

BinPackParameters 似乎为函数声明提供了预期的结果,但BinPackArguments 似乎不像人们对函数调用所期望的那样工作。

这是一个简单的测试文件:

#include <stdbool.h>

void function_with_a_huge_name_that_should_just_not_be(unsigned int a, char *b, unsigned int c, unsigned int d, unsigned int e)
{
    return;
}

int main()
{
    function_with_a_huge_name_that_should_just_not_be(13, "bb", 1234234, 4324324, 2355345);
}

这是它的格式:

#include <stdbool.h>

void function_with_a_huge_name_that_should_just_not_be(unsigned int a,
    char *b,
    unsigned int c,
    unsigned int d,
    unsigned int e)
{
    return;
}

int main()
{
    function_with_a_huge_name_that_should_just_not_be(
        13, "bb", 1234234, 4324324, 2355345);
}

我的.clang-format文件如下:

---
AccessModifierOffset: -2
AlignAfterOpenBracket: false
AlignEscapedNewlinesLeft: false
AlignOperands:   true
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Inline
AlwaysBreakAfterDefinitionReturnType: false
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: false
BinPackParameters: false
BinPackArguments: false
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Linux
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: true
ColumnLimit:     80
CommentPragmas:  '^ IWYU pragma:'
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: false
DerivePointerAlignment: false
IndentCaseLabels: false
IndentWidth:     4
IndentWrappedFunctionNames: false
IndentFunctionDeclarationAfterType: false
KeepEmptyLinesAtTheStartOfBlocks: false
Language:        Cpp
MaxEmptyLinesToKeep: 2
NamespaceIndentation: None
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakString: 1000
PenaltyBreakFirstLessLess: 120
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Right
SpaceAfterCStyleCast: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles:  false
SpacesInCStyleCastParentheses: false
SpacesInContainerLiterals: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard:        Auto
TabWidth:        4
UseTab:          Never

我的 clang 格式版本是:3.6.0 (tags/RELEASE_360/final)

BinPackParametersBinPackArguments 都为 false,我希望函数调用的缩进与函数声明的缩进相同。

知道我做错了什么吗?

【问题讨论】:

    标签: clang clang-format


    【解决方案1】:

    我不认为你做错了什么。发生的情况是 clang-format 意识到您调用函数的行长于列限制(设置中的 80 个字符)。您的 AlignAfterOpenBracket 设置为 false,因此 clang-format 将参数放在新行上(请注意,AlignAfterOpenBracket 在更高版本的 clang-format 中获得了更多可能性)。

    您已将两个 BinPack... 设置都设置为 false,但是还有一个附加设置可以控制函数声明与函数调用,AllowAllParametersOfDeclarationOnNextLine(在您的示例中设置为 false)。对于函数声明,如果所有参数与函数名称不在同一行,这将导致所有参数位于不同的行。函数调用没有对应的设置。

    在你的情况下,你给函数的参数放在函数名之后的下一行。第二行的长度

    所以答案是,从 3.9 版开始,无法配置 clang-format 以将每个参数放在单独的行上(如果它们适合一行)。

    【讨论】:

      【解决方案2】:

      尝试将ColumnLimit 设置为0。看起来此选项“覆盖”或比BinPackParametersBinPackArguments 选项具有更高的优先级。

      【讨论】:

      • 谢谢,但是ColumnLimit 0 的样式没有变化,因为没有哪条线被认为太大而需要中断。
      • 这实际上对我有用。 “列限制为 0 意味着没有列限制。在这种情况下,clang-format 将尊重语句中输入的换行决定,除非它们与其他规则相矛盾。” clang.llvm.org/docs/ClangFormatStyleOptions.html
      • 有解决办法吗?我还在 LLVM 上放了一个关于这个问题的错误,因为我不能使用 clang-format 处理这个可怕的错误:bugs.llvm.org/show_bug.cgi?id=35968
      【解决方案3】:

      BinPack* 选项设置为 false 将强制参数/参数要么全部在一行,要么每个在单独的行。两种情况都允许,但不能混合,例如。不允许两个参数放在一行,其余的放在另一行是不允许的。

      clang-format 似乎为每种情况分别选择 all-on-one-line 与 each-on-separate-line 格式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        • 2022-01-24
        • 2015-05-11
        • 2020-05-15
        • 2014-10-31
        • 2018-02-12
        相关资源
        最近更新 更多