Next: , Up: Writing C


5.1 あなたのソースコードの書式

C関数の本体を開始する開き大括弧をゼロ列目に置き、他の開き大括弧や開き丸 括弧や開き角括弧をゼロ列目に置かないようにするのは重要だ。いくつかのツー ルは、C関数の始まりを探すのに、ゼロ列目の開き大括弧を捜す。これらのツー ルはそういう風にフォーマットされていないコードでは上手く動かないだろう。

関数定義で、関数の名前がゼロ列目で始まっていることも重要だ。人々はこれの おかげで関数定義を探すのが楽になり、あるツールがそれらを認識するのも楽に なるかもしれない。こうして、適切な書式は次のようになる。

     static char *
     concat (s1, s2)        /* Name starts in column zero here */
          char *s1, *s2;
     {                     /* Open brace in column zero here */
       ...
     }

あるいは、もしansi Cを使いたいなら、次のように定義をフォーマットす る。

     static char *
     concat (char *s1, char *s2)
     {
       ...
     }

ansi Cでは、もし引数が上手く一行に収まらないなら、次のようにそれを 分ける。

     int
     lots_of_args (int an_integer, long a_long, short a_short,
                   double a_double, float a_float)
     ...

関数の本体では、次のようにフォーマットされたコードを好んでいる。

     if (x < foo (y, z))
       haha = bar[4] + 5;
     else
       {
         while (z)
           {
             haha += foo (z, z);
             z--;
           }
         return ++x + bar ();
       }

我々は開き丸括弧の前とコンマの後にスペースがあるとプログラムを読むのがよ り簡単であることを見出している。とりわけコンマの後は。

式を複数行に分けるとき、演算子の後ではなく、それの前で分ける。こうするの が正しいやり方だ。

     if (foo_this_is_long && bar > win (x, y, z)
         && remaining_condition)

字下げが同じところで、異なる優先度の二つの演算子を持たないようにしなさい。 例えば、こう書いてはいけない。

     mode = (inmode[j] == VOIDmode
             || GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j])
            ? outmode[j] : inmode[j]);

代わりに、字下げが入れ子を表すよう、余分な丸括弧を使う。

     mode = ((inmode[j] == VOIDmode
              || (GET_MODE_SIZE (outmode[j]) > GET_MODE_SIZE (inmode[j])))
             ? outmode[j] : inmode[j]);

Emacsがそのコードを適切に字下げするよう、余分な丸括弧を入れなさい。例え ば、次の字下げは手でやるといい感じだが、Emacsは台なしにしてしまう。

     v = rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000
         + rup->ru_stime.tv_sec*1000 + rup->ru_stime.tv_usec/1000;

でも開き括弧一組を加えると問題は解決する。

     v = (rup->ru_utime.tv_sec*1000 + rup->ru_utime.tv_usec/1000
          + rup->ru_stime.tv_sec*1000 + rup->ru_stime.tv_usec/1000);

do-while文は次のようにフォーマットする。

     do
       {
         a = foo (a);
       }
     while (a > 0);

フォームフィード文字 (control-L) を使って、プログラムを(関数の中ではなく) 論理的な位置でページに分割してほしい。ページがどれぐらいの長さかなんて問 題じゃない。印刷されるページに合わせなくていいのだから。フォームフィード は行の中にそれ自身だけを置くべきだ。