clang-format BinPackArguments没有按预期工作

时间:2015-05-05 15:44:16

标签: clang clang-format

clang-format有两个名为BinPackParameters的选项 BinPackArguments。它们似乎控制着函数声明和函数调用的缩进方式。

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

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

如果BinPackParametersBinPackArguments都是假的,那么我希望得到函数调用的缩进,就像我得到函数声明一样。

知道我做错了吗?

3 个答案:

答案 0 :(得分:1)

尝试将ColumnLimit设置为0.看起来这个选项&#34;覆盖&#34;或者优先于BinPackParametersBinPackArguments选项。

答案 1 :(得分:1)

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

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

在您的情况下,您为函数提供的参数将放在函数名称后面的下一行。第二行的长度是&lt; 80,所以clang-format不再做任何事情。如果参数行的长度超过列限制,则clang-format会将它们放在不同的行上。

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

答案 2 :(得分:0)

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

clang-format似乎为每个案例分别选择一对一和每个单独行格式。