C ++識別子でアンダースコアを使用する際のルールは何ですか?

945
Roger Lipscombe 2008-10-23 21:02.

C ++では、ローカル変数やパラメーターではなく、メンバー変数であることを示すために、ある種のプレフィックスを付けてメンバー変数に名前を付けるのが一般的です。MFCのバックグラウンドを持っている場合は、おそらくを使用しますm_foo。私もmyFoo時々見ました。

C#(またはおそらく.NET)は、のようにアンダースコアのみを使用することを推奨しているよう_fooです。これはC ++標準で許可されていますか?

5 answers

868

ルール(C ++ 11では変更されていません):

  • 実装マクロとしての使用を含め、任意のスコープで予約されています。
    • アンダースコアで始まり、直後に大文字が続く識別子
    • 隣接するアンダースコア(または「二重アンダースコア」)を含む識別子
  • グローバル名前空間で予約済み:
    • アンダースコアで始まる識別子
  • また、std名前空間内のすべてが予約されています。(ただし、テンプレートの特殊化を追加することはできます。)

2003 C ++標準から:

17.4.3.1.2グローバル名[lib.global.names]

名前と関数シグネチャの特定のセットは、常に実装用に予約されています。

  • 二重下線(__)を含む、または下線で始まり大文字(2.11)が続く各名前は、あらゆる用途のために実装用に予約されています。
  • アンダースコアで始まる各名前は、グローバル名前空間で名前として使用するために実装用に予約されています。165

165)このような名前は、名前空間::std(17.4.3.1)でも予約されています。

C ++はC標準(1.1 / 2、C ++ 03)に基づいており、C99は規範的な参照(1.2 / 1、C ++ 03)であるため、1999C標準からこれらも適用されます。

7.1.3予約済み識別子

各ヘッダーは、関連する副節にリストされているすべての識別子を宣言または定義し、オプションで、関連する将来のライブラリ方向の副節にリストされている識別子と、任意の使用またはファイルスコープ識別子としての使用のために常に予約されている識別子を宣言または定義します。

  • アンダースコアで始まり、大文字または別のアンダースコアのいずれかで始まるすべての識別子は、常に使用のために予約されています。
  • アンダースコアで始まるすべての識別子は、通常の名前空間とタグの名前空間の両方でファイルスコープを持つ識別子として使用するために常に予約されています。
  • 次の副節(将来のライブラリの方向を含む)の各マクロ名は、関連するヘッダーのいずれかが含まれている場合に指定されたとおりに使用するために予約されています。特に明記されていない限り(7.1.4を参照)。
  • 以下の副節(将来の図書館の方向性を含む)のいずれかに外部リンケージを持つすべての識別子は、常に外部リンケージを持つ識別子として使用するために予約されています。154
  • 次の副節(将来のライブラリの方向を含む)のいずれかにリストされているファイルスコープを持つ各識別子は、マクロ名として、および関連するヘッダーのいずれかが含まれている場合は同じ名前空間内のファイルスコープを持つ識別子として使用するために予約されています。

他の識別子は予約されていません。プログラムが予約されているコンテキストで識別子を宣言または定義する場合(7.1.4で許可されている場合を除く)、または予約された識別子をマクロ名として定義する場合、動作は未定義です。

プログラムが#undef上記の最初のグループの識別子のマクロ定義を(で)削除した場合、動作は未定義です。

154)外部結合を持つ予約識別子のリストは、errnomath_errhandlingsetjmp、およびva_end

その他の制限が適用される場合があります。たとえば、POSIX標準では、通常のコードに表示される可能性のある多くの識別子が予約されています。

  • E大文字で始まる名前の後に数字または大文字が続きます。
    • 追加のエラーコード名に使用される場合があります。
  • いずれかで始まる名前、isまたはto小文字 で始まる名前
    • 追加の文字テストおよび変換機能に使用できます。
  • LC_大文字で始まり大文字 で始まる名前
    • ロケール属性を指定する追加のマクロに使用できます。
  • 接尾辞が付いている、fまたはl予約され ている既存のすべての数学関数の名前
    • それぞれfloat引数とlongdouble引数を操作する対応する関数の場合。
  • SIG大文字で始まり大文字で始まる名前は予約されています
    • 追加の信号名については。
  • SIG_大文字で始まり大文字で始まる名前は予約されています
    • 追加のシグナルアクション用。
  • 始まる名前strmemまたはwcs小文字が続くが予約されています
    • 追加の文字列および配列関数用。
  • 小文字で始まる、PRIまたはSCNその後に続く名前、またはX予約済みの 名前
    • 追加のフォーマット指定子マクロの場合
  • で終わる名前_tは予約されています
    • 追加のタイプ名については。

現在、これらの名前を独自の目的で使用しても問題は発生しない可能性がありますが、その標準の将来のバージョンと競合する可能性があります。


個人的には、識別子をアンダースコアで始めません。私のルールへの新しい追加:アンダースコアを使用することはめったにないので、どこにも二重アンダースコアを使用しないでください。これは簡単です。

この記事の調査を行った後_t、これはPOSIX標準によって予約されているため、識別子をで終わらせることはありません。

で終わる識別子に関するルールは_t私をとても驚かせました。これは、明確化と公式の章と節を探しているPOSIX標準(まだわかりません)だと思います。これはGNUlibtoolマニュアルからのもので、予約名がリストされています。

CesarBは、POSIX 2004の予約済みシンボルへの次のリンクを提供し、「他の多くの予約済みプレフィックスとサフィックスがそこにある」と述べています。POSIX 2008予約シンボルは、ここで定義されています。制限は、上記の制限よりも多少微妙です。

202
paercebal 2008-10-23 21:27.

名前の衝突を回避するためのルールは、C ++標準(Stroustrupの本を参照)とC ++の達人(Sutterなど)の両方に記載されています。

個人支配

私はケースを扱いたくなく、単純なルールが必要だったので、単純で正しい両方の個人的なルールを設計しました。

シンボルに名前を付けるとき、次の場合にコンパイラ/ OS /標準ライブラリとの衝突を回避します。

  • アンダースコアで記号を開始しないでください
  • 内部に2つの連続したアンダースコアが含まれるシンボルに名前を付けないでください。

もちろん、コードを一意の名前空間に配置すると、衝突を回避するのにも役立ちます(ただし、悪意のあるマクロからは保護されません)。

いくつかの例

(マクロはC / C ++シンボルのコード汚染が多いため使用しますが、変数名からクラス名まで何でもかまいません)

#define _WRONG
#define __WRONG_AGAIN
#define RIGHT_
#define WRONG__WRONG
#define RIGHT_RIGHT
#define RIGHT_x_RIGHT

C ++ 0xドラフトからの抜粋

n3242.pdfファイルから(最終的な標準テキストも同様であると思います):

17.6.3.3.2グローバル名[global.names]

名前と関数シグネチャの特定のセットは、常に実装用に予約されています。

—二重下線_ _を含む、または下線で始まり大文字(2.12)が続く各名前は、あらゆる用途のために実装用に予約されています。

—アンダースコアで始まる各名前は、グローバル名前空間で名前として使用するために実装用に予約されています。

だけでなく:

17.6.3.3.5ユーザー定義のリテラルサフィックス[usrlit.suffix]

アンダースコアで始まらないリテラルサフィックス識別子は、将来の標準化のために予約されています。

この最後の句は、グローバル名前空間で定義されていない場合、1つのアンダースコアで始まり、その後に小文字が続く名前で問題ないと考えない限り、混乱を招きます。

40
Roger Lipscombe 2008-10-23 21:06.

MSDNから:

識別子の先頭に2つの連続したアンダースコア文字(__)を使用するか、先頭に1つのアンダースコアを付けて大文字を使用することは、すべてのスコープでのC ++実装用に予約されています。現在または将来の予約済み識別子と競合する可能性があるため、ファイルスコープを持つ名前には、先頭に1つのアンダースコアとそれに続く小文字を使用しないでください。

これは、小文字が後に続く限り、単一のアンダースコアをメンバー変数プレフィックスとして使用できることを意味します。

これは明らかにC ++標準のセクション17.4.3.1.2から取られていますが、完全な標準の元のソースをオンラインで見つけることができません。

この質問も参照してください。

25
Max Lybbert 2008-11-15 10:03.

質問の他の部分については、変数名の最後にアンダースコアを付けて、内部のものと衝突しないようにするのが一般的です。

クラスや名前空間内でもこれを行います。これは、1つのルールを覚えるだけでよいためです(「グローバルスコープ内の名前の末尾、およびその他の場所の名前の先頭」と比較して)。

1
John Millikin 2008-10-23 21:05.

はい、アンダースコアは識別子のどこでも使用できます。ルールは次のとおりです。最初の文字のaz、AZ、_のいずれか、および次の文字の+ 0〜9。

アンダースコアプレフィックスはCコードで一般的です。単一のアンダースコアは「プライベート」を意味し、二重のアンダースコアは通常、コンパイラが使用するために予約されています。

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

グッドジョブ、ESPN

グッドジョブ、ESPN

今日のホワイトハウスの記者会見で、報道官のサラ・ハッカビー・サンダースは、スポーツセンターのホストであるイェメル・ヒルのドナルド・トランプに関する最近のツイートについてコメントするよう求められ、大統領と彼の政策を白人至上主義者として説明した。ヒルは彼女のつぶやきのためにESPNによって公に叱責されました。

アマゾンからのこのレミントンツールセールで髪を整える、スタイルを整える、乾かす、または取り除く

アマゾンからのこのレミントンツールセールで髪を整える、スタイルを整える、乾かす、または取り除く

基本的に頭のあらゆる部分から髪の毛を整えたり、ブロードライしたり、まっすぐにしたり、脱毛したりする必要がある場合は、このレミントンゴールドボックスが最適です。今日だけ、Amazonは、すでに人気のあるShortcut Pro Self-HaircutKitやPearlPro Ceramic Flat Ironのように、グルーミングをはるかに簡単にするヘアツールをマークダウンしています。

カナダの元桂冠詩人が、史上最高の文化の盗用でトゥパックとマヤアンジェロウから盗んだ

カナダの元桂冠詩人が、史上最高の文化の盗用でトゥパックとマヤアンジェロウから盗んだ

トゥパックシャクール(ティムモーゼンフェルダー/ゲッティイメージズ); マヤアンジェロウ(マーティンゴッドウィン/ゲッティイメージズ)移動、テイラースウィフト。ケンドールとカイリーは、必要な数の座席を持っています。

テスラは、ハリケーンイルマによる避難を容易にするために、フロリダでの車両の範囲を拡大しています

テスラは、ハリケーンイルマによる避難を容易にするために、フロリダでの車両の範囲を拡大しています

写真:Tesla Motorsフロリダに住んでいて、Tesla Model S、Model X 60、またはModel 60Dを使用している場合、車の自律性は50 km(約30マイル)高くなります。これは失敗ではなく、ハリケーンイルマによる避難作業を容易にするために会社自身が命じた自治権の一時的な延長です。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language