本物のC

礼儀作法:コーディングスタイル


コードの書き方について。

C のコードには空白や改行をかなり自由に挿入できるので、なるべく見やすくするにしてもいくつかの流儀があります。

インデントスタイル

プログラムのブロック構造を見やすくする為、行頭に挿入する空白をインデントと呼びます。

インデントはブロック 1 つ毎にスペース 4 つ分を空けるのが一般的かつ見やすいでしょう。実際の書き方としては次の二通りがあります。

「インデントスタイル」と言うと主に中括弧{ }の置き方に関する流儀を指していて、主に以下の二つがあります。

BSD スタイル

中括弧{ }にはそれぞれ単一の行を与えます。

int main(int argc, char *argv[])
{
if (argc < 2)
{
...
}
else
{
...
}
...
}

密度が低くなり見通しが良いですが、多少間延びした印象になります。

K&R スタイル

制御構文の中括弧にはなるべく行を与えません。

int main(int argc, char *argv[])
{
if (argc < 2) {
...
} else {
...
}
...
}

密度は上がるものの、まとまりが良い印象になります。

間隔を空ける

スペース

演算子の前後、区切り, ;の後などは基本的にスペースを挟むべきです。

  • offset+unit*countよりもoffset + unit * count
  • year<=2000&&month<=6よりもyear <= 2000 && month <= 6
  • func(foo,bar,baz)よりもfunc(foo, bar, baz)
  • for(i=0;i<n;i++)よりもfor (i = 0; i < n; i++)

空け過ぎに見える場合はfor (i=0; i<n; i++)の様に多少詰めても良いでしょう。

改行

長すぎる行や縦に並べた方が分かりやすそうな部分は適当に改行すべきです。

printf("[%04d/%02d/%02d %02d:%02d:%02d] %s\n",
t->tm_year, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec,
message);
if (weight >= 5000 && maxLoad >= 3000 && capacity >= 11
&& weight < 11000 && maxLoad < 6500 && capacity <= 29)

折り返し行のインデントは前の行と綺麗に並ぶ様に微調整する流儀もあります。

verbosely_named_function(some_parameter_struct->option->foo,
some_parameter_struct->option->bar);

コードのまとまりを見やすくする為に改行を入れるのも良いでしょう。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int n;
if (argc < 2)
return EXIT_FAILURE;
n = atoi(argv[1]);
...
}

行の長さに関しては、大昔にはパンチカードだのターミナルだのの幅が 80 文字分だったのでそれに合わせるべきという話がありました。今やそんなものを気にしなくても良くなってきていますが、単純に長い行は見辛いので避けましょう。

タブ

変数宣言や構造体のメンバは数が多い場合、タブで位置を揃えた方が見やすくなります。

struct linked_list
{
linked_list before,
after;
ref_count ref;
spinlock lock;
void *object;
};

寛容の精神

「読みやすさ」とは結局一つの価値判断なので、あまり拘ると宗教戦争を引き起こします。特に「BSD スタイル対 K&R スタイル」や「スペースインデント対タブインデント」の戦いは熾烈を極めるものです。

どちらにもそれなりの利点があるからこそ長く使われているのであり、どの利点欠点を重視するかは結局個人の好みです。一人でこっそり書いている内は良いですが、郷に入ったならば郷に従い、柔軟に対処しましょう。

因みに Linux カーネルのコーディングスタイルは「JF: Linux Kernel 2.6 Documentation: CodingStyle」で日本語訳を読む事ができます。