gpt4 book ai didi

c++ - 在 operator=( 以 clang 格式后中断

转载 作者:行者123 更新时间:2023-12-01 13:09:15 26 4
gpt4 key购买 nike

我在 C++ 中使用来自 LLVM 7.0.0 的 clang-format 和 Windows 10。

我有以下类(class)

class FooooooooooooooooooC
{
public:
FooooooooooooooooooC() = default;
const FooooooooooooooooooC& operator=( const FooooooooooooooooooC& ) = delete;

};

在运行 clang-format 后它应该是这样的
class FooooooooooooooooooC
{
public:
FooooooooooooooooooC() = default;
const FooooooooooooooooooC& operator=(
const FooooooooooooooooooC& ) = delete;

};

但实际上它在运行 clang-format 后看起来像这样
class FooooooooooooooooooC
{
public:
FooooooooooooooooooC() = default;
const FooooooooooooooooooC&
operator=( const FooooooooooooooooooC& ) = delete;

};

我在 .clang-format 中的 clang-fromat 设置是
---
AccessModifierOffset: -3
AlignAfterOpenBracket: AlwaysBreak
AlignConsecutiveAssignments: true
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Right
AlignOperands: true
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: true
BinPackArguments: false
BinPackParameters: false
BraceWrapping:
AfterClass: true
AfterControlStatement: true
AfterEnum: true
AfterFunction: true
AfterNamespace: true
AfterObjCDeclaration: true
AfterStruct: true
AfterUnion: true
AfterExternBlock: true
BeforeCatch: true
BeforeElse: true
IndentBraces: true
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakAfterJavaFieldAnnotations: false
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Custom
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeComma
BreakInheritanceList: BeforeComma
BreakStringLiterals: true
CommentPragmas: '^ IWYU pragma:'
ColumnLimit: 80
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 0
ContinuationIndentWidth: 3
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IncludeBlocks: Regroup
IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
Priority: 3
- Regex: '.*'
Priority: 1
IncludeIsMainRegex: '(Test)?$'
IndentCaseLabels: true
IndentPPDirectives: None
IndentWidth: 3
IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
Language: Cpp
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 1000000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Left
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterTemplateKeyword: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: true
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInContainerLiterals: true
SpacesInParentheses: true
SpacesInSquareBrackets: true
Standard: Cpp11
TabWidth: 3
UseTab: Never
...

有人知道如何配置 clang-fromat 以在之后创建休息

operator=(



谢谢!

最佳答案

总之,你不能完全做你想做的。
以下是如何配置 clang-format 在 const FooooooooooooooooooC& 之后不中断.
在决定如何拆分行时,clang-format 使用了几个名称都以 Penalty 开头的权重因子。 .在这种情况下,您希望返回类型与函数名称保持在同一行,因此您需要调整 PenaltyReturnTypeOnItsOwnLine . .clang 格式中的值是 60 .相反,使用:

PenaltyReturnTypeOnItsOwnLine: 200
使其成为任何值 110或更大以防止线路在 const FooooooooooooooooooC& 之后被破坏返回类型。我建议 200匹配 Chromium、Google 和 Mozilla 的预定义 clang 格式样式。 (另外,我不知道为什么 110 是阈值;惩罚值相当不透明,我只是通过实验找到了该值。)
然而,你最终得到的是这样的:
   const FooooooooooooooooooC& operator=( const FooooooooooooooooooC& ) =
delete;
我不相信有任何方法可以在 operator=( 之后强制中断.如果你的类名长 4 个字符,那么你会得到你想要的,因为上面的分割在 delete 之前将超过 80 个字符。
  • 上面的评论提到ColumnLimit .即使您被允许增加列限制,它也只允许您保留 operator=一行声明。它不允许你强制它在 operator=( 之后分割线.
  • 上面的评论提到AllowAllParametersOfDeclarationOnNextLine: false .正如您所发现的,这并不能解决问题。当有多个参数时,这会影响是否将所有参数放在单独的行上的决定。但是你只有一个参数。 (请参阅 documentation。)

  • 最后,请注意,与您的 7.0.0 相比,我使用的是 clang-format 6.0.0。但是在 clang-format 中似乎没有任何差异,这会在这里产生任何差异:
  • ReleaseNotes.html没有提到任何重要的事情
  • 与 6.0.0 相比,7.0.0 中有几个新的 clang-format 样式选项(我注意到这是因为 clang-format 6.0.0 在您的 .clang-format 文件中提示它们),但没有一个与此问题相关。
  • 关于c++ - 在 operator=( 以 clang 格式后中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53835831/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com