1

次のように C コードをフォーマットすることによって、どのような利点が得られるか:

while(lock_file(lockdir)==0)
    {
    count++;
    if(count==20)
        {
        fprintf(stderr,"Can't lock dir %s\n",lockdir);
        exit(1);
        }
    sleep(3);
    }
if(rmdir(serverdir)!=0)
    {
    switch(errno)
        {
        case EEXIST:
            fprintf(stderr,"Server dir %s not empty\n",serverdir);
            break;
        default:
            fprintf(stderr,"Can't delete dir %s\n",serverdir);
        }
    exit(1);
    }
unlock_file(lockdir);

次のようなより典型的なものに対して

while(lock_file(lockdir)==0) {
    count++;
    if(count==20) {
        fprintf(stderr,"Can't lock dir %s\n",lockdir);
        exit(1);
    }
    sleep(3);
}
if(rmdir(serverdir)!=0) {
    switch(errno) {
        case EEXIST:
            fprintf(stderr,"Server dir %s not empty\n",serverdir);
            break;
        default:
            fprintf(stderr,"Can't delete dir %s\n",serverdir);
    }
    exit(1);
}
unlock_file(lockdir);

トップバージョンは読みにくく、長いブロックの外側のステートメント、特にいくつかのネストされたブロックを含む longs ブロックのインデントレベルを正しくするのが難しいと思います。

私が見ることができる唯一の利点は、あなたが書いたコードに指紋を残すことだけです。

一番上のケースを処理するには、vim の書式設定を手動で行う必要があることに気付きました。

4

10 に答える 10

27

一番上の例は「ホワイトスミススタイル」として知られています。インデントスタイルに関するウィキペディアのエントリでは、いくつかのスタイルとその長所と短所について説明しています。

于 2008-11-07T09:35:09.827 に答える
9

あなたが見ているインデントはWhitesmiths スタイルです。Code Completeの初版では、「begin-end Block Boundaries」として説明されています。このスタイルの基本的な議論は、C (および Pascal) のような言語ではif、単一のステートメントまたはブロックのいずれかが管理されるということです。ifしたがって、一貫してインデントすることにより、ブロックの内容だけでなく、ブロック全体をステートメントの下位に表示する必要があります。

XXXXXXXXXXXXXXX       if (test)
   XXXXXXXXXXXX           one_thing();

XXXXXXXXXXXXXXX       if (test)
   X                     {
   XXXXX                 one_thing();
   XXXXX                 another_thing();
   X                     }

私がこの本を最初に読んだとき (90 年代)、「begin-end Block Boundaries」の議論は説得力がありましたが、実際に (Pascal で) 実践したときはあまり好きではありませんでした。私は C のほうが好きではなく、読むのがややこしいです。私は最終的に、Steve McConnel が「純粋なブロックのエミュレート」と呼んでいるもの ( Sun の Java スタイル、ほぼK&Rです) を使用することになります。

XXXXXXXXXXXXXX X      if (test) {
   XXXXXX                one_thing();
   XXXXXX                another_thing();
X                     }

これは、Java でのプログラミングに使用される最も一般的なスタイルです (これは私が一日中行っていることです)。また、「エミュレーション」を必要としない「純粋なブロック」言語であった以前の言語に最も似ています。単一ステートメントの本体はなく、ブロックは制御構造の構文に固有のものです。

IF test THEN
   oneThing;
   anotherThing
END
于 2008-11-07T17:05:52.587 に答える
8

何もない。インデントやその他のコーディング標準は好みの問題です。

于 2008-09-16T09:57:04.237 に答える
5

それは私にはかなり標準的に見えます。私が行う唯一の個人的な変更は、中括弧を次の行の先頭ではなく前の行の先頭に揃えることですが、これは個人的な選択です。

とにかく、あなたが見ているフォーマットのスタイルは、CとC ++の標準的なものであり、コードを読みやすくするために使用されます。特に、インデントのレベルを見ると、どこにいるかがわかります。インデントされたループ、条件など。例:

if (x == 0) 
{
  if (y == 2)
  {
    if (z == 3)
    {
       do_something (x);
    }
  }
}

その例では、何が起こっているかを確認するのは非常に簡単ですが、それらのifステートメント内に多くのコードを入れると、一貫したインデントなしでどこにいるかを判断するのが難しい場合があります。

あなたの例では、exit(1)ステートメントの位置を見てください-それがそのようにインデントされていなければ、これがどこにあったかを知るのは難しいでしょう。それがそうであるように、あなたはそれがその大きなifステートメントの終わりにあると言うことができます。

于 2008-09-16T10:10:33.843 に答える
4

個人的な好みだと思いましたか?コードブロックが縦一列に並んでいるので、一目で分かりやすいのではないでしょうか?個人的には、前の行のすぐ下でブレースを開始することを好みます

于 2008-09-16T09:57:24.000 に答える
3

いくつかのフォーマットとコメントの基準に従うことにより、まず最初に、あなたが書いたコードを読んだり編集したりする他の人々に敬意を表します。ルールを受け入れず、なんらかの難解なコードを記述した場合、最も可能性の高い結果は、他の人(プログラマー)と効果的に通信できなくなることです。ソフトウェアがあなただけによって書かれ、誰もそれを読むことを期待されていない場合、コード形式は個人的な選択ですが、現代のソフトウェアは1人だけで書かれているものはいくつありますか?

于 2008-09-16T10:03:55.547 に答える
3

コードのフォーマットは個人的な好みです。読みやすい限り、維持費がかかります!

于 2008-09-16T09:58:27.867 に答える
1

それは単なる別のスタイルです-人々はコーディングしたい方法でコーディングし、それは受け入れられたスタイルの1つです(ただし、私の好みではありません). ブラケットがインデントされていないが、その中のコードがインデントされている、より一般的なスタイルよりも、不利な点や有利な点はあまりないと思います。おそらく、コードブロックをより明確に区切ると言うことで、それを正当化することができます.

于 2008-09-16T09:57:48.930 に答える
1

この形式が「利点」を持つためには、比較する別の形式の同等の C コードが本当に必要です!

私が働いている場所では、このインデント スキームは、独自の折りたたみエディター メカニズムを容易にするために使用されています。

したがって、私はこの形式に根本的に問題があるとは思いません。特定の合理的な制限内では、形式は個人的な好みの問題です。

于 2008-09-16T09:58:55.823 に答える