C/C++のポインタと参照、右寄せか左寄せか


このエントリーをはてなブックマークに追加

CやC++でポインタ変数を宣言するとき、次の2通りの書き方はどちらもコンパイルが通る。

int *p1;  // 右寄せ
int* p2;  // 左寄せ

自分は右寄せで書くことが多い。理由は特にない。最初にCを勉強するときに使った教科書が右寄せのスタイルをとっていたから、というだけである。

しかし最近他の人のコードで右寄せのものを目にする機会が何度か立て続けにあった。はたしてどちらが多数派なのか、簡単に調べてみることにした。

まずは手持ちの本をチェック。同じ本でもページによって両方のスタイルを使っているものもある。なので以下の調査には漏れがあることをご容赦願いたい。

Bjarne StroustrupC++の設計と進化」

C++開発者のBjarne Stroustrupは左寄せ。p271から引用。

void* operator new(size_t, void* p)
{
    return p;
}

参照の&も、ポインタと同じく左寄せ。

ちなみに、本は当然のように未読。

スコット・メイヤーズ「Effective C++ 第3版」

ポインタは右寄せで書かれていることが多いようだ。p8から引用すると

char *p = greeting;

型が複雑になると、*の前後両方にスペースが付く。同じくp8から:

char * const p = greeting;

参照は、ポインタと違って左寄せだ。なんでだろう?わからない…。p55から引用すると

PriorityCustomer(const PriorityCustomer& rhs);

その他の本

引用はしないけど、他の本は以下のようなスタイルをとっていた。

  • 林晴彦「新C++言語入門 ビギナー編」:右寄せ
  • ハーバード・シルト「独習C」:右寄せ
  • アンドリュー・ハント、デビット・トーマス「達人プログラマー」:右寄せ
  • 高林哲 ほか「BINARY HACKS」:右寄せ

Cの本は右寄せが多い気がする。しかし、まだサンプルが少なくてなんとも言えない。



では世の中のコーディング規約はどうなっているのだろうか。

Googleのコーディング規約

Googleのコーディング規約では、右寄せも左寄せもどちらもOKとしている。以下、引用。

// These are fine, space preceding.
char *c;
const string &str;

// These are fine, space following.
char* c;    // but remember to do "char* c, *d, *e, ...;"!
const string& str;

しかし、*の前後両方にスペースを開けるのはダメだと言っている。

char * c;  // Bad - spaces on both sides of *
const string & str;  // Bad - spaces on both sides of &

暫定的な結論

どちらでもよい。お好きな方で。