通过clang格式对lambda格式化的逻辑是什么?

时间:2015-07-09 19:37:00

标签: c++ c++11 emacs lambda clang-format

我正在使用clang-format(版本3.5)与Emacs(版本24.5.2)。这是由LLVM样式中的clang-format格式化的一段简单代码:

int main() {
    std::cout << "> ";
    std::string word;
    while (std::cin >> word) {
        std::cout << std::accumulate(word.cbegin(), word.cend(), 0,
                                     [](int cur, char ch) {
                         return cur + (ch - '0');
                     }) << std::endl << "> ";
    }
    return 0;
}

请注意它是如何对齐lambda的正文和右大括号。这种格式是否有任何逻辑,或者只是缺乏对lambda的支持?我需要设置clang-format的配置参数以获得更好的格式吗?

2 个答案:

答案 0 :(得分:2)

std::accumulate(word.cbegin(), word.cend(), 0, [](int cur, char ch) { return cur + (ch - '0'); })

这里我们有一个很长的函数调用。为了清理它,我们采取长时间的论证,然后将它分成它们自己的行:

std::accumulate(word.cbegin(), word.cend(), 0,
[](int cur, char ch) { return cur + (ch - '0'); })

当我们这样做时,我们将参数缩进以与(

对齐
std::accumulate(word.cbegin(), word.cend(), 0,
                [](int cur, char ch) { return cur + (ch - '0'); })
到目前为止一切顺利。现在我们有一个开放的{。嗯,这意味着新的一行

std::accumulate(word.cbegin(), word.cend(), 0,
                [](int cur, char ch) {
return cur + (ch - '0'); })

缩进。缩进的基础在哪里?那么,std::accumulate的开始。添加4个空格:

std::accumulate(word.cbegin(), word.cend(), 0,
                [](int cur, char ch) {
    return cur + (ch - '0'); })

然后我们点击}。新线,支持者:

std::accumulate(word.cbegin(), word.cend(), 0,
                [](int cur, char ch) {
    return cur + (ch - '0');
})

最后,将它嵌入到一个更大的表达式的中间,你就会得到上面的混乱。

上述内容纯粹是一个合理的故事,并非基于clang-format的专业知识。我无法告诉你如何做得更好。

答案 1 :(得分:0)

您可能希望AlignAfterOpenBracket: false[]留下来。

在我看来,在开放式支架后对齐导致浪费太多的空间,这是一个奇迹,它是如此受欢迎。使用ContinuationIndentWidth来控制延续缩进的距离。

Lambdas仍然没有完美对齐,但至少你的lambda开口不在右边一英里。我对lambng格式的lambdas格式也不是很满意。