アンダースコアで変数/メンバーを開始すると、コンパイラが困惑することがありますか?


12

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

int _a;

または

int __a;

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

私の知る限り、これが名前の最後にアンダースコアを移動することを好む理由です:

int a_;

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

だから私は疑問に思う:これは最近の問題ではないのですか?最新のコンパイラは命名規則について賢いですか?


本当の答えではありませんが、プライベートメンバー変数の前にアンダースコアを使用する(少なくともC#では)Microsoftの内部スタイルであるため、MicrosoftのC ++コンパイラはこれについて特に寛容です。私は、g ++が依然として先頭のアンダースコアに問題があることを知っています。
-KChaloux

6
この質問への回答が役立つ場合があります。
Blrfl

1
@KChalouxは、MicrosoftのC ++コンパイラチームが20年以上にわたって存在していると思う場合、C#チームの一部の人々の習慣に基づいて許容可能な識別子名に関するルールを確立した場合、Microsoftがどのように機能するかわかりません:-) 真剣に、最初のC ++コンパイラをリリースしてから21年が経ち、これらのルールは以前のCコンパイラコードベースにまでさかのぼります。
ケイトグレゴリー

@ケイト私は彼らがC#でそれを使用したという事実を知っていたことを指摘していました。私はMicrosoftのC ++コンパイラを使用していないか、そこでの環境についてひどく知っているわけではないので、C#の経験からC ++でのその命名スタイルの使用を推測していました。作ったことがない任意の C#のルールが最初に来たことを主張します。
KChaloux

回答:


17

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

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

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

疑いなく、これらのプレフィックスを使用しない理由です。


3
コメントは2つのアンダースコアのプレフィックスに適用されますが、単一のアンダースコアには適用されません
ケイトグレゴリー

1
@KateGregory:アンダースコアで始まる名前は、グローバル名前空間の名前の実装で使用するために予約されています。先頭のアンダースコアとそれに続く2番目のアンダースコアまたは大文字は、使用のために予約されています(これらは実装によってマクロに使用できます)。そのため、ローカルスコープでは先頭にアンダースコアを付け、その後に小文字を付けることは可能ですが、トリップして予約名を使用することを避けるために避けるのが最善です。
バートヴァンインゲンシェナウ

4
@KateGregory:メンバーとしては_limitエラーではありませんが、グローバル関数としてはエラーです。一部のコンテキストでは許可し、他のコンテキストでは許可しないポリシーよりも、「例外なく先頭のアンダースコアを使用しない」という単純なポリシーを使用する方が良いと思います。しかし、我々はそれに異議を唱えることに同意することができます。そして明確にするために、私は最初から他の場所でアンダースコアに問題はありません。
バートヴァンインゲン

2
@BartvanIngenSchenau:興味があるだけです:「プライベートクラスのメンバーにのみ、先頭のアンダースコアを使用する」などの単純なポリシーは、技術的な問題につながるべきではありません。
ドックブラウン

1
@KateGregory明確にするために、ルールは答えで言っていることよりも正確であることに同意します。しかし、それは正確にルールが何であるかを思い出そうとするとき、私の記憶の精度の欠如を反映しています。私は例外(機能ではない)を知る必要がなくなるので、特にそのような重要ではないルールについては、従うのが一般的なルールを好む。楽しいのは、これを覚えているよりも、ムーブセマンティックの方が安心していることです。多分それは私がそれについて考えるので今では楽しくないです
...-クライム

16

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

アンダースコアを嫌う人もいます。あなたが何かを呼び出すかどうかm_indexか、highest_priceもしくは_aそれを彼らは憎みます- 。25年前に、特定のIBMプリンター(非常に人気のあるプリンター)について、他のすべての行の一番下のピクセルを省略して、ページにさらに多くの行を収める誰かと話しました。これはメモや数字などの大きな出力の出力には適していましたが、アンダースコアの半分を非表示にするコードには効果がありました。(はい、本当に!)その世代の人々は一般に、そのプリンターとの相互作用、またはアンダースコアを使用しないことを彼らにぶつけた誰かと働くことから、不合理なアンダースコア嫌いを持っています。

ほとんどの人が混在する場合(私たちは、中に持って言わなかったオプション、Fortranの)より読みやすいアプローチを使用して検索する:mIndexHighestPricea以前下線例にかなりよく立ち上がります。次の2つのルールを示します。

  • 2つのアンダースコアで何も開始しない(関数、変数、マクロ、typedef)
  • 一貫性のある規則を選ぶ(例:_limit関数のパラメータのために、m_limitメンバ変数のために、すべての単語、ハンガリー語、大文字に、アンダースコア、キャメルケースを使用することはありません、何かそれにスティックを)。最初にアンダースコアを付けたり、時には最後にアンダースコアを付けたり、時にはアンダースコアを使用したり、5種類の大文字と小文字の規則を使用したりしないでください。一貫してください。

問題のプリンタはなくなっています。一度に1つのアンダースコアを使用する場合は、お気軽に。しかし、アンダースコアの嫌悪感はまだ存在していることを理解してください。


「m_index、highest_price、または_aを呼び出すかどうか-彼らはそれを嫌います」識別子の先頭のアンダースコアの使用に特に関連する規則が標準にあることについては言及していません。簡単に回避できるのに、なぜトラブルを招くのですか?stackoverflow.com/a/228797
Max Barraclough

言及しなかった?最初の文をもう一度読んでください。
ケイトグレゴリー

「これは1つのアンダースコアの使用には当てはまりません」は話全体ではありません。ダブルアンダースコアを使用したリードはかなり明確なノーノーですが、「グローバルネームスペースで予約済み:で始まる識別子アンダースコア」。なぜ火で遊ぶのですか?
マックスバラクラ

1
わかりました、あなたはポイントを逃しています。2番目のパラグラフでは、一般的にアンチアンダースコアである人々の存在について議論しています。先頭に下線がありません。すべての下線。はい、2つのアンダースコアに関するルールに加えて、大文字が続くアンダースコア、グローバルスコープなどでアンダースコアをリードすることに関するルールもありますが、それ以外に、とにかくアンダースコアが嫌いな人もいます。そして、それらの人々は私が間違っていると呼ぶのが好きです。主要でない下線に反対する標準ベースの理由はありません。しかし、人々はとにかくそうします。
ケイトグレゴリー

それは私たちが反対するところです。はい、単一のアンダースコアで識別子を開始することは時々合法です。上に書いたように、なぜ火で遊ぶのですか?アンダースコアで識別子を開始することはありません。私はそれをコードの匂いとして見ています(匂いを「見る」と言うことができるなら:-P)。そうすれば、そうすることが合法かどうかを正確に教えてくれるルールの詳細について心配することはありません。
マックスバラクラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.