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我的clang格式版本是:3.6.0 (tags/RELEASE_360/final)
在BinPackParameters和BinPackArguments都为false的情况下,我希望函数调用的缩进与函数声明的缩进相同。
你知道我做错了什么吗?
发布于 2016-01-18 03:27:50
我不认为你做错了什么。发生的情况是clang-format意识到您调用函数的行长于您的列限制(在您的设置中为80个字符)。您的格式设置为false,因此clang-format将参数放在新行上(请注意,AlignAfterOpenBracket在后来的clang-format版本中获得了额外的可能性)。
您已经将两个BinPack...设置都设置为false,但是还有一个额外的设置来控制函数声明和函数调用AllowAllParametersOfDeclarationOnNextLine (在您的示例中设置为false )。对于函数声明,如果所有参数与函数名不在同一行上,这将导致所有参数位于不同的行上。对于函数调用,没有相应的设置。
在本例中,您为函数提供的参数放在函数名后的下一行中。第二行的长度小于80,因此clang-format不再对其执行任何操作。如果参数行长于您的列限制,clang-format将把它们放在单独的行上。
所以答案是,从3.9版开始,没有办法将clang-format配置为将每个参数放在单独的行上,如果它们适合放在一行上。
发布于 2015-05-16 06:03:24
尝试将ColumnLimit设置为0。看起来这个选项“覆盖”或者比BinPackParameters和BinPackArguments选项有更高的优先级。
发布于 2015-12-17 00:19:25
设置为false的BinPack*选项将强制参数/参数要么全部在一行上,要么每个都在单独的行上。这两种情况都是允许的,但不能混合,例如。不允许在一行上有两个参数,而在另一行上有其他参数。
clang-format似乎为每种情况分别选择了“全部在一行”格式,而不是“每行”格式。
https://stackoverflow.com/questions/30057534
复制相似问题