66

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

たとえば、C ++標準ライブラリとBoostのクラス名は常に小文字で、単語をアンダースコアで区切ります(たとえば、、std::vector) 。一方、C ++で見たほとんどのスタイルガイドは、CamelCaseスタイル(たとえば、)の傾向があります。boost::unordered_mapstd::map::const_iteratorTcpConnectionInt32

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

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

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

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

4

3 に答える 3

41

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

これは彼がこのトピックについて議論している彼のFAQへのリンクです:

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

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

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

于 2012-12-14T16:01:36.560 に答える
8

BjarneStroustrup以外にも正当な理由があります。ファンクターを使用するときは、関数のように見せたいと思います。

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

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

于 2012-12-14T17:28:06.903 に答える
4

本当に必要なルールは、既知の問題を防ぐために設計されたルールだけです。

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

これを超えて、一貫性を保ち、あまりうるさくならないでください。コーディング標準は、「小さなものに汗を流さないでください」というルール#0に注意する必要があります。コーディング標準が多すぎると、小さな問題が発生します。

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

于 2012-12-14T18:19:57.103 に答える