web-dev-qa-db-ja.com

STL / Boost C ++コーディングスタイルが他の人と大きく異なるのはなぜですか?

私はかなりルーキーなC++プログラマーですが、言語の経験が限られているため、ほとんどの標準C++スタイルガイドライン(例: Google C++スタイルガイドライン )は、stlおよびboostライブラリに実装されているものに反しています。

たとえば、C++標準ライブラリとBoostのクラス名は常に小文字で、アンダースコアで単語が区切られています(例:_std::vector_、_boost::unordered_map_、_std::map::const_iterator_) C++の場合は、キャメルケーススタイル(たとえば、TcpConnectionまたは_Int32_)に向かう傾向があります。

同じことがメソッドにも当てはまります。標準ライブラリとBoostは、クラスの場合と同じようにメソッドと関数に同じスタイルを使用します(例:std::map<>::get_equal("foo"))。一方、ほとんどのスタイルガイドはpascalCaseまたはCamelCaseを提唱しています。

これをRubyのような言語と比較すると、ほとんどのユーザーはコアライブラリで使用される規則を順守しているため、標準C++ライブラリと他のすべてのコードとの間にそのような違いがあるのは奇妙に思えます。

誰かがこれがなぜなのか知っていますか?

編集:明確にするために、実際の実装スタイルではなく、表面的なテキストスタイル(ケーシング、アンダースコアの使用など)について説明しています。

63
Karl Nicoll

アンダースコアと小文字は、Bjarne Stroustrupが「C++プログラミング言語」で付与したスタイルです。私が正しく思い出せば、彼は、英語が第一言語ではない国際社会にとってより読みやすいので、名前のアンダースコアが好まれるべきであるという線に沿って声明を出した。彼の意見が真実かどうかはわかりませんが、それが起源だと思います。

以下は彼のFAQへのリンクです。

http://www.stroustrup.com/bs_faq2.html#Hungarian

特に興味のあることを説明するスニペット:

ElementCountやElementCountなどの代替ではなく、アンダースコアを使用して識別子内の単語(element_countなど)を区切るのが好きです。すべて大文字の名前(BEGIN_TRANSACTIONなど)を使用しないでください。これは通常マクロ用に予約されているためです。マクロを使用しない場合でも、誰かがヘッダーファイルをマクロで散らかしている可能性があります。タイプに最初の大文字を使用してください(例:SquareおよびGraph)。 C++言語と標準ライブラリは大文字を使用しないため、Intではなくint、Stringではなくstringです。そうすれば、標準タイプを認識できます。

38
Kevin

Bjarne Stroustrupの横には正当な理由があります。ファンクタを使用するとき、ファンクタを関数のように見せたいです。

ただし、CamelCaseスタイルガイドでは、クラス名の最初の文字に大文字を使用し、メソッドの最初の文字にLowerCaseを使用することで、クラスとメソッドおよび関数を区別します。

これは、c ++アルゴリズムスタイルのプログラミングと一貫性がありません。ファンクタと関数を区別する理由はないので、ファンクタを使用する場合(および通常は必要な場合)、c ++およびstlコーディングスタイルを使用することをお勧めします。

7
geekpp

本当に必要な唯一のルールは、既知の問題を防ぐように設計されたルールです。

  • ALL_CAPS(および下線と数字)をプリプロセッサ名に使用し、プリプロセッサ名にのみ使用します。 (おそらく)非プリプロセッサ識別子とプリプロセッサ名との衝突によって引き起こされる問題を追いかけるのは難しいかもしれませんが、それらを修正するのはさらに困難です。
  • アンダースコアで識別子を開始しないでください。また、識別子の内側に二重アンダースコアを含めないでください。これらは実装用に予約されています。

これを超えて、一貫性を保ち、あまりうるさくしないでください。コーディング標準は、ルール#0に留意する必要があります。これは、「小さなことをやるな」というものです。あまりにも多くのコーディング標準が小さなものを圧倒しています。

GoogleのC++標準に関する限り、それは最良ではありません。これは、Cプラスまたはマイナス標準に近いものです。たとえば、非定数参照による受け渡しを禁止します。

1
David Hammen