clang-format:中断函数参数而不是函数限定符(noexcept)

clang-format: break on function arguments instead of function qualifiers (noexcept)

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

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

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

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

两个片段之间的区别在于,在 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 选项。

我同意任何规则组合都无法获得所需的输出,但是当您发现此类情况时,有一种方法可以强制执行。

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

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

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

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

就其价值而言,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 { /* ... */
}