4

clang-formatEmacs (バージョン 24.5.2) で (バージョン 3.5) を使用しています。clang-format以下は、 LLVM スタイルでフォーマットされた単純なコードです。

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それとも s のサポートが不足しているだけですか? clang-formatフォーマットを改善するために設定する必要 がある構成パラメーターはありますか?

4

2 に答える 2

3

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。どうすれば良くなるかは教えません。

于 2015-07-09T20:56:22.570 に答える
0

あなたはそれを左AlignAfterOpenBracket: falseに持ってきたいかもしれません。[]

私の意見では、開き括弧の後に配置すると無駄なスペースが多すぎます。これほど人気が​​あるのは不思議です。ContinuationIndentWidth継続をどれだけインデントするかを制御するために使用します。

ラムダはまだ完全には整列していませんが、少なくともラムダの開始点は右に 1 マイルもありません。私は、clang-format のラムダの書式設定にも完全に満足していません。

于 2016-04-21T18:45:21.097 に答える