web-dev-qa-db-ja.com

アンダースコアで変数/メンバーを開始して、コンパイラーのパズルを解くことができますか?

私は高校以来、このような変数を定義することを教えられてきました:

int _a;

または

int __a;

これは、アンダースコアで始まる変数を使用して一時変数に名前を付けるコンパイラーを最終的に困惑させるため、悪い習慣と考える必要があります。

私が知る限り、これが一部の人が名前の最後にアンダースコアを移動したい理由です。

int a_;

ただし、アンダースコアで始まる変数を使用するコードがたくさんあります。そして、そのコードはVisual Studio 2010とg ++ 4.xの両方でかなりうまくビルドされます。

だから私は不思議に思う:これは今日では問題ではないのですか?最新のコンパイラーは命名規則についてより賢明ですか?

12
Emiliano

プレフィックスの下線が悪い習慣である理由を明らかに誤解している。簡単に言うと、CおよびC++標準は、標準ライブラリの実装など、実装の詳細のためにこれらのプレフィックスを予約しているためです。 (_と__は同じもののために予約されていないことに注意してください。コメントを参照してください)

名前がスコープ(名前空間、クラスなど)の下にある場合でも、これらの接頭辞を使用するグローバル名、特にマクロが存在する可能性があり、それらを使用するとコードが暗黙的に壊れる可能性があります。

したがって、基本的に、ほとんどの場合、これらの接頭辞を使用しても安全ですが、使用しない場合は、名前が実装名と競合しないことが100%保証されます。

これが、疑わしいことに、これらの接頭辞を使用しない理由です。

17
Klaim

twoアンダースコアの使用は間違いなく悪いことです-これはコンパイラ固有の実装の詳細のために予約されています。これは、1つのアンダースコアの使用には適用されません。

アンダースコアが嫌いな人もいます。あなたが何かを呼ぶかどうかm_indexまたはhighest_priceまたは_a-彼らはそれを嫌います。私は25年前に、1行おきに下のピクセルを省略して、より多くの行をページに収める特定のIBMプリンター(非常に人気のあるプリンター)について教えてくれた誰かと協力しました。これはメモや数値の大きな帯などの出力には問題ありませんが、アンダースコアの半分を非表示にするコードには効果がありました。 (はい、本当に!)その世代の人々は、一般に、そのプリンターとのやり取りから、またはアンダースコアを使用しないように彼らに打ち込んだ誰かとの作業のいずれかによって、不合理なアンダースコアが嫌いです。

ほとんどの人は、大文字と小文字の混合(たとえば、Fortranにはなかったオプション)を使用することで、より読みやすいアプローチを見つけます:mIndexHighestPricea以前に強調された例。私はあなたに2つのルールを与えます:

  • 2つのアンダースコアで何か(関数、変数、マクロ、typedef)を開始しない
  • 一貫した規則を選択します(例:_limitは関数パラメーター、m_limitメンバー変数の場合は、アンダースコア、キャメルケースを使用せず、すべての単語、ハンガリー語、(something)を大文字にして、それに固執します。アンダースコアを最初に、時には最後に、時には使用せずに、5つの異なる大文字と小文字の規則を使用して、うんざりしないでください。一貫している。

問題のプリンターはもうなくなっています。一度に1つのアンダースコアを使用する場合は、自由に使用してください。しかし、理解してください、アンダースコアの嫌悪者はまだ存在しています。

16
Kate Gregory