2010-11-24 3 views
1

これは無数のC/C++ヘッダーとソースファイルでこれを見てきました。
個人的な好みは別として、これらの異なる表記の意味は何ですか?_NAME、__NAME、_NAME_、__NAME__のような表記の意味

  • _NAME
  • __NAME
  • _NAME_
  • __NAME__
  • NAME_t

かなり正直に、私は理解一方のみに(クラスのプライベートメンバーである、_NAMEであります少なくともC#である)。

誰かの違いを説明できますか?
他にも顕著な表記法がある場合は、それらに言及してください(他の同様の言語でも)。

ありがとうございます!

答えて

5

_または__で始まる名前は、通常は予約済み識別子用であり、その規則で始まる識別子を定義/作成しないでください。 (_次アッパーケース付)

C99標準から

、7.1.3 - 「予約識別子」

- アンダースコアで始まり、大文字または別の アンダースコアのどちらかが常にのために予約されているすべての識別さERS任意の使用。

- アンダースコアで始まるすべての識別子は、通常の名前スペースとタグ名スペースの両方にファイルスコープを持つ識別子 として使用するために予約されています。 C++ 03標準(C++ 98の改正)、セクション17.4.3.1.2から

- "グローバル名"

- ダブルアンダースコアが含まれているそれぞれの名前(_ _)またはアンダースコアで始まり大文字の後ろに続く数字(2.11)は、使用のために実装に予約されています。

- アンダースコアで始まるそれぞれの名前は、NAME_tを除き グローバル名前空間に名として使用するための実装に

3

を予約されているこれらの名前の全てが「実現」のために予約され、その標準のC++ライブラリコードです。 あなたは自分のコードでそのような名前を使用することは禁じられています

セクション17.6.3.3。2「グローバル名」§1状態:

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

  • ダブルアンダースコアが含まれているかが続くアンダースコアで始まり、それぞれの名前大文字は実装のために予約されています。

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

(これらのルールは、私はかなり頻繁に見ている__MY_FILE_Hのようなヘッダガードを禁止することに注意してください。)_tで終わる

+1

これをもっと明確にするには、アンダースコア*で始まるクラスレベルの名前は*(グローバル名前空間にないため)許可されており、プライベートフィールドによく使用されます。 –

+0

@Matteo:2番目の文字が大文字でない限り、これは正しいです。しかし '_ [A-Z _] +'は完全に予約されています。 –

+0

@R:はい、そうですが、もう一つの答えはこの点でより完全です。 –

2

タイプは、POSIXによってreservedです。

関連する問題