我有一个像这样的C ++类:
class A {
public:
A() :
m_a(someValue1),
m_b(someValue2),
m_c(someValue3)
{
}
// .... other class members
private:
A m_a;
B m_b;
C m_c;
};
使用clang-format格式化此代码后,我得到:
class A {
public:
A() :
m_a(someValue1), m_b(someValue2), m_c(someValue3)
{
}
// .... other class members
private:
A m_a;
B m_b;
C m_c;
};
即构造函数中的初始化程序列表已格式化为单行,直到达到允许的最大行长为止。
我的问题是如何告诉clang-format将每个元素保留在自己的行上,就像格式化之前在我的原始代码中一样?我找不到任何合适的参数。我试图将参数AllowShortBlocksOnASingleLine设置为true和false,这对我来说似乎是最合适的,但这对它没有影响。因此,有人可以建议如何实现这种格式吗?
这是我的.clang格式:
BasedOnStyle: Google
AccessModifierOffset: '-4'
AlignAfterOpenBracket: DontAlign
AlignConsecutiveAssignments: 'false'
AlignConsecutiveDeclarations: 'false'
AlignEscapedNewlines: Left
AlignOperands: 'true'
AlignTrailingComments: 'false'
AllowAllParametersOfDeclarationOnNextLine: 'true'
AllowShortBlocksOnASingleLine: 'true'
AllowShortCaseLabelsOnASingleLine: 'true'
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: 'true'
AllowShortLoopsOnASingleLine: 'false'
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: 'false'
AlwaysBreakTemplateDeclarations: 'true'
BinPackArguments: 'true'
BinPackParameters: 'true'
BreakAfterJavaFieldAnnotations: 'true'
BreakBeforeBinaryOperators: NonAssignment
BreakBeforeBraces: Custom
BraceWrapping:
AfterFunction: true
SplitEmptyFunction: true
BreakBeforeInheritanceComma: 'false'
BreakBeforeTernaryOperators: 'true'
BreakConstructorInitializers: AfterColon
BreakStringLiterals: 'true'
ColumnLimit: '100'
CompactNamespaces: 'false'
ConstructorInitializerAllOnOneLineOrOnePerLine: 'false'
ConstructorInitializerIndentWidth: '4'
ContinuationIndentWidth: '8'
Cpp11BracedListStyle: 'true'
DerivePointerAlignment: 'false'
DisableFormat: 'false'
ExperimentalAutoDetectBinPacking: 'false'
FixNamespaceComments: 'true'
IncludeBlocks: Preserve
IndentCaseLabels: 'true'
IndentPPDirectives: None
IndentWidth: '4'
IndentWrappedFunctionNames: 'false'
JavaScriptQuotes: Double
JavaScriptWrapImports: 'true'
KeepEmptyLinesAtTheStartOfBlocks: 'false'
NamespaceIndentation: None
PointerAlignment: Left
ReflowComments: 'false'
SortIncludes: 'true'
SortUsingDeclarations: 'true'
SpaceAfterCStyleCast: 'true'
SpaceAfterTemplateKeyword: 'false'
SpaceBeforeAssignmentOperators: 'true'
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: 'false'
SpacesBeforeTrailingComments: '2'
SpacesInAngles: 'false'
SpacesInCStyleCastParentheses: 'false'
SpacesInContainerLiterals: 'false'
SpacesInParentheses: 'false'
SpacesInSquareBrackets: 'false'
Standard: Cpp11
TabWidth: '4'
UseTab: Never
UPDATE :按照clang格式的选项称为“ ConstructorInitializerAllOnOneLineOrOnePerLine”,其描述如下:“如果构造函数初始值设定项不适合一行,则将每个初始值设定项放在自己的行中”。 但是,它仍然不能满足我的要求,因为只有在不符合列数限制的情况下,它才会将初始化程序移动到新行。因此,即使没有达到列限制,似乎也没有办法强制clang格式将后续的初始化程序放在下一行。 如果上述选项变成带有附加值的枚举,那将是很好的,即使没有达到列数限制,该值也将强制将初始化方法放置到下一行。
答案 0 :(得分:2)
我很确定这是clang格式的错误/缺点。 该问题已在2015年得到解决,但被clang格式的开发人员拒绝:https://reviews.llvm.org/D14484
对于它的价值,我对clang格式进行了简单的更改,该格式应该可以为您提供预期的行为: https://github.com/Nikolai-Hlubek/clang/tree/ConstructorInitializer_AlwaysBreakAfterColon
我向上游发出了推送请求,但是我怀疑它会被接受。
答案 1 :(得分:1)
我个人使用
BreakConstructorInitializers: BeforeComma
,但其他选项可用。请参见BreakConstructorInitializers
部分中的Clang-Format Style Options。您的样式似乎是AfterColon
。
答案 2 :(得分:0)
我正在尝试做同样的事情。我能做的最好的事情是:
SpaceBeforeCtorInitializerColon: true
ConstructorInitializerIndentWidth: 4
BreakBeforeInheritanceComma: false
BreakInheritanceList: AfterColon
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: AfterColon
ConstructorInitializerAllOnOneLineOrOnePerLine: true
但是,除非您突破列数限制,否则这仍会将列表放在单行上。
答案 3 :(得分:0)
还有两种其他解决方法(有缺点):
// clang-format off
和// clang-format on
->缺点:clang-format
也不对该部分应用有用的格式。ColumnLimit
设置为0
。这样就可以修复AfterColon
的使用,使其正常工作。缺点:您不能对项目强制执行列限制。在我们的一个项目(LMMS)中,我们决定只建议一个列数限制:我们的编码约定现在包含一个子句,其中说“每一行文本最多应为120个字符长”。BreakConstructorInitializers: BeforeComma
。看起来有些不同,但是它可以正常工作,并且会将所有初始化都打包到单独的行中。