【问题标题】:clang-format: break on function arguments instead of function qualifiers (noexcept)clang-format:中断函数参数而不是函数限定符(noexcept)
【发布时间】:2020-06-26 00:01:55
【问题描述】:

我正在寻找一种方法来使用 clang-format(版本 9.0.0)格式化下面的 C++ 代码,以便在参数声明后破坏超过 80 列限制的函数定义,而不是像 noexcept 这样的 C++ 函数限定符:

void scheduler::stop_mark(service &current, service const &stopped) const
    noexcept {
  // ...
}

上面的 sn-p 显示了我使用 LLVM 默认样式格式化的代码,下面的代码是我在正确格式化后想要的代码:

void scheduler::stop_mark(service& current,
                          service const& stopped) const noexcept {
  // ...
}

这两种sn-ps的区别在于,断行是在service& current,之后,而不是noexcept之后。

使用LLVM 默认样式时,此行为是可重现的,但我使用以下选项作为参考:

---
BasedOnStyle: LLVM

AlignAfterOpenBracket: Align
AllowAllArgumentsOnNextLine: 'true'
AllowAllConstructorInitializersOnNextLine: 'true'
AllowAllParametersOfDeclarationOnNextLine: 'true'
AllowShortCaseLabelsOnASingleLine: 'false'
AllowShortFunctionsOnASingleLine: Empty
AllowShortLambdasOnASingleLine: Empty
AlwaysBreakTemplateDeclarations: 'Yes'
BinPackArguments: 'true'
BinPackParameters: 'true'
BreakConstructorInitializers: BeforeComma
BreakConstructorInitializersBeforeComma: 'true'
ConstructorInitializerIndentWidth: 2
FixNamespaceComments: 'true'
IndentCaseLabels: 'true'
IndentPPDirectives: AfterHash
PenaltyBreakAssignment: 1000
PenaltyBreakBeforeFirstCallParameter: 50
PointerAlignment: Left
...

是否可以通过clang-format得到这样的格式?

我已经检查了https://zed0.co.uk/clang-format-configurator/ 上所有可能的选项,但找不到匹配的 clang-format 选项。

【问题讨论】:

  • FWIW,它似乎将括号括起来的输入(例如:param decl)视为一个单元,在匹配括号时不会拆分,即( 和) 在同一行内列限制。

标签: c++ llvm clang-format


【解决方案1】:

对于它的价值,clang-format 10.0.1 似乎可以满足您的需求:

$> clang-format --version
clang-format version 10.0.1 (Fedora 10.0.1-3.fc32)
$> echo " void scheduler::stop_mark(service &current, service const &stopped) const noexcept { /* ... */ }" | clang-format --style=LLVM
void scheduler::stop_mark(service &current,
                          service const &stopped) const noexcept { /* ... */
}


【讨论】:

  • 是的,你是对的,这似乎在最近的 LLVM 版本之一中得到了纠正
【解决方案2】:

据我所知,你不能这样做。

我最初的想法是将BinPackParameters 设置为false,但似乎clang-format 即使在这种情况下也倾向于打破函数限定符。

【讨论】:

    【解决方案3】:

    我同意任何规则组合都不会获得所需的输出,但是当你发现这样的东西时,有一种方法可以强制它。

    在第一个参数后添加行注释(可以为空)。然后 clang-format 将为您调整参数。

    void scheduler::stop_mark(service& current, //
                              service const& stopped) const noexcept {
      // ...
    }
    

    【讨论】:

    • 您可以证明不授予任何积分,但您认为合适。就个人而言,我宁愿保持沉默。这并没有改变这样一个事实,即似乎没有一个配置可以满足您的需求。
    猜你喜欢
    • 2020-03-18
    • 2014-03-24
    • 2022-12-23
    • 2015-11-30
    • 2020-09-15
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    相关资源
    最近更新 更多