使用 clang-format 保留用作函数中间参数的短 lambda 完整

问题描述 投票:0回答:2

我想使用 clang-format 格式化代码,并保留 lambda 用作中间函数参数完整(按原样):

void f()
{
    func(0, [] {}, 0);
}

我在 clang-format 9.0(以及 11.0.0-2663a25f)中尝试的所有内容都将参数包装到下一行,即:

void f()
{
    func(
        0, [] {}, 0); // not-ok
}

如果没有第一个或/和最后一个参数,即使内置

-style='WebKit'
选项也能给出所需的结果:

void f()
{
    func([] {}, 0); // ok
    func(0, [] {}); // ok 
    func([] {});    // ok 
}

自 LLVM 8.0 以来,似乎有些东西发生了变化(损坏),因为 7.1 可以按需要工作。 IE。给我的和原来的一样:

void f()
{
    func(0, [] {}, 0); // how to achieve this after clang-format?
}
c++ lambda clang-format
2个回答
2
投票

最新版本的

clang-format
(即 10)具有特定于格式化 lambda 的配置选项。具体来说,您所要求的可以通过分配给配置指令
AllowShortLambdasOnASingleLine
SLS_Inline
来实现。

以下是官方文档中提供的其他选项:

允许ShortLambdasOnASingleLine

(ShortLambdaStyle)

根据值,auto lambda { return 0; } 可以放在一行中。

可能的值:

SLS_None
(在配置中:无)切勿将 lambda 合并到单行中。

SLS_Empty
(配置中:空)仅合并空 lambda。

auto lambda = [](int a) {}
auto lambda2 = [](int a) {
    return a;
};

SLS_Inline
(在配置中:内联)如果函数的参数将 lambda 合并到单行中。

auto lambda = [](int a) {
    return a;
};
sort(a.begin(), a.end(), ()[] { return x < y; })

SLS_All
(配置中:全部)将所有 lambda 表达式合并到一条线上。

auto lambda = [](int a) {}
auto lambda2 = [](int a) { return a; };

我没有找到在

clang-format
附带的
LLVM 8
上执行相同操作的方法。我发现的最接近的配置如下

clang-format -style={BasedOnStyle: WebKit, AllowShortFunctionsOnASingleLine: true,  AllowShortBlocksOnASingleLine: true}

无论如何,它没有达到您的全部要求,这就是它在我的 Windows 笔记本电脑上的样子:

void f() {
  func([this] { return false; },
       this);                           // ok
  func(this, [this] { return false; }); // ok
  func([this] { return false; });       // ok
}

0
投票

此问题已在 LLVM 18 中修复。 GitHub 上的相关已关闭错误报告此处

© www.soinside.com 2019 - 2024. All rights reserved.