2009年4月10日金曜日

C++コーディングスタイルについてのあれこれ

このブログ記事をはてなブックマークに追加

多くのプログラマ同様、C++を書くときには個人的にいくつかのこだわりを持っている。まず、main関数のreturn文は明示的に書くことにしている。規格ではmain関数のreturnを省略した場合、return 0;が書かれたものとして動作するが、C89では戻り値は不定であり(C99では戻り値はC++と同じく0)、戻り値を0としたい場合は、必ずreturn 0;としなければならない。CとC++の統一性が崩れることが嫌なこともあり、いつもreturn 0;を入れているのだ。あと、コードの雛形を書くときに、mainの中身が空だと何となく落ちつかないってのもある。

また、戻り値を必要としない前置および後置のインクリメント/デクリメント(i++, ++i, i--, --i)については、intやdoubleなどのスカラー値では後置、STLのイテレータやユーザ定義型などのような非スカラー値の場合は前置にしている。一時オブジェクトを必要とする非スカラー値では効率に大きく影響するので、前置を使うわけだ。因みに、スカラー値の場合、戻り値を必要としない前置と後置の演算子でまったく同じ動作(副作用がない)であることが規格上決められているので、効率は全く変わらない。だったら、前置で統一すれば良いと思われるかもしれないが、Cでは伝統的にfor文などで後置が使われることが多く、自分もCでは後置を使っていたので、それを踏襲している。スカラー値か非スカラー値か一目でわかるのも良い。因みにGoogleが採用しているC++スタイルガイドでも非スカラー値は前置でなければならないが、スカラー値はどちらでも良いことになっている。

あとは、括弧()の使い方だが、forのような文では、for (int i = 0; i < 10; i++)のように、for(の間にスペースを入れる。関数ではfunc(int n)のように関数と(の間は詰めて書く。式2つを一行で書く際にはa = 1; b = 2;のように;bの間のスペースは2つとする。ほかにもいろいろと細かいことを自分なりに決めているが、このぐらいにしておく。

ああ、でも、ポインタの宣言や仮引数は未だに迷うなぁ。Cならint *p;だし、C++ならint* p;だ。上記のGoogleのスタイルガイドではどちらでも良いことになっている。ただし、同じファイル内では統一するべき。

以下はコード例。

void func(int a[], int n) { for (int i = 0; i < n; i++) { a[i] = i * i; } } int main() { int a[10]; func(a, sizeof(a) / sizeof(*a)); return 0; }

念のために断っておくけど、上記のコーディングスタイル以外を認めなかったり、駄目だと考えているわけではない。これはあくまで自分の個人的なコーディングスタイルの話。

0 コメント: