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