Namespaces
Variants

Identifier

From cppreference.net

識別子 は、数字、アンダースコア、ラテン文字の小文字と大文字 、および \u \U エスケープ 表記で指定されたUnicode文字から成る任意の長さのシーケンスです (C99以降) XID_Continue クラスの文字) (C23以降) 。有効な識別子は非数字文字(ラテン文字、アンダースコア 、またはUnicode非数字文字 (C99以降) (C23以前) 、または XID_Start クラスのUnicode文字) (C23以降) )で始まる必要があります。識別子は大文字と小文字を区別します(小文字と大文字は異なる文字として扱われます)。 すべての識別子は 正規化形式C に準拠する必要があります。 (C23以降)

識別子に生の(エスケープされていない)Unicode文字が許可されるかどうかは実装定義です:
char *\U0001f431 = "cat"; // supported
char *🐱 = "cat"; // implementation-defined
                  // (e.g. works with Clang, but not GCC prior to version 10)
                  // both are ill formed in C23. Emoji are not XID_Start characters
(C99以降)
(C23まで)
ISO/IEC 10646 (Unicode)の対応するコードポイントがXID_StartまたはXID_Continueプロパティを持つ実装定義の文字は、それぞれ識別子の先頭または最初の文字の後に現れることができます。 (C23以降)

識別子は以下の種類のエンティティを表すことができます:

マクロ名またはマクロパラメータ名以外のすべての識別子は、 スコープ を持ち、 名前空間 に属し、 リンケージ を持つ場合があります。同じ識別子がプログラム内の異なるポイントで異なるエンティティを表すことができ、また、エンティティが異なる名前空間にある場合には同じポイントで異なるエンティティを表すことも可能です。

目次

予約識別子

以下の識別子は 予約済み であり、プログラム内で宣言することはできません(これを行うと未定義動作を引き起こします):

  1. キーワード である識別子は他の目的に使用できません。特に、キーワードと同一の識別子の#defineや#undefは許可されません。
  2. アンダースコアで始まるすべての外部識別子。
  3. アンダースコアに続いて大文字または別のアンダースコアが続くすべての識別子(これらの予約済み識別子により、ライブラリは多数の内部非外部マクロや関数を使用できます)。
  4. 標準ライブラリで定義されているすべての外部識別子(ホスト環境において)。これは、ユーザーが提供する外部名がライブラリ名と一致してはならないことを意味し、ライブラリ関数と同一の関数を宣言する場合でも同様です。
  5. 実装または将来の標準ライブラリでの使用のために予約されていると宣言された識別子(下記参照)。
  6. 実装によって提供され、潜在的に予約されていると宣言された識別子(下記参照)。 (C23以降)

その他のすべての識別子は利用可能です。予約されていない識別子 または潜在的に予約されていない識別子 (C23以降) は、プログラムをあるコンパイラやライブラリから別のものに移行する際に、予期しない衝突の恐れなく使用できます。

注記: C++では、どこかに二重下線を含む識別子はどこでも予約されています。Cでは、二重下線で始まる識別子のみが予約されています。

ライブラリにおける予約済みおよび潜在的に予約済みの識別子

標準ライブラリは、それが提供するすべての識別子を予約しています。 外部リンケージ を持つ予約識別子(例えばすべての標準関数の名前)は、どのヘッダがインクルードされるかに関わらず予約されます。その他の予約識別子は、関連するヘッダのいずれかがインクルードされた場合に予約されます。

潜在的に予約済み識別子は、実装および将来の標準改訂で使用されることを意図しています。実装によって潜在的に予約済み識別子が提供される場合、それは予約済みとなります。

実装は、関数名として予約されている潜在的に予約済み識別子の external definitions のみを提供することが許可されています。

実装によって提供されない潜在的に予約済み識別子は予約されていません。それらは未定義動作なしにユーザーが宣言または定義できます。ただし、そのような使用は移植性がありません。

(C23以降)

以下の識別子は実装または標準ライブラリの将来の使用のために予約 または潜在的に予約 (C23以降) されています。

  • 関数名 、これらはすべて予約されている可能性がある (C23以降)
    • cerf , cerfc , cexp2 , cexpm1 , clog10 , clog1p , clog2 , clgamma , ctgamma , csinpi , ccospi , ctanpi , casinpi , cacospi , catanpi , ccompoundn , cpown , cpowr , crootn , crsqrt , cexp10m1 , cexp10 , cexp2m1 , clog10p1 , clog2p1 , clogp1 (C23以降) およびそれらの-fおよび-l接尾辞付きバリアント、 <complex.h> (C99以降)
    • is または to で始まり、その後に小文字が続くもの、 <ctype.h> および <wctype.h> (C95以降)
    • str または wcs (C23以降) で始まり、その後に小文字が続くもの、 <stdlib.h> および <inttypes.h> (C23以降)
    • cr_ で始まるもの、 <math.h> (C23以降)
    • wcs で始まり、その後に小文字が続くもの、 <wchar.h> (C95以降)
    • atomic_ で始まり、その後に小文字が続くもの、 <stdatomic.h> (C11以降)
    • cnd_ mtx_ thrd_ または tss_ で始まり、その後に小文字が続くもの、 <threads.h> (C11以降)
  • typedef名 、これらはすべて予約されている可能性がある (C23以降)
    • int または uint で始まり _t で終わるもの、 <stdint.h> (C99以降)
    • atomic_ または memory_ で始まり、その後ろに小文字が続くもの、 <stdatomic.h> (C11以降)
    • cnd_ mtx_ thrd_ または tss_ で始まり、その後ろに小文字が続くもの、 <threads.h> (C11以降)
  • マクロ名
    • E で始まり、数字または大文字が続くもの( <errno.h> 内)
    • FE_ で始まり、大文字が続くもの( <fenv.h> 内) (C99以降)
    • DBL_ DEC32_ DEC64_ DEC128_ DEC_ FLT_ 、または LDBL_ で始まり、大文字が続くもの( <float.h> 内);これらの識別子は予約されている可能性あり (C23以降)
    • INT または UINT で始まり、 _MAX _MIN _WIDTH (C23以降) または _C で終わるもの( <stdint.h> 内) ;これらの識別子は予約されている可能性あり (C23以降) (C99以降)
    • PRI または SCN で始まり、小文字または文字 X が続くもの( <inttypes.h> 内) ;これらの識別子は予約されている可能性あり (C23以降) (C99以降)
    • LC_ で始まり、大文字が続くもの( <locale.h> 内)
    • FP_ で始まり、大文字が続くもの( <math.h> 内) (C23以降)
    • MATH_ で始まり、大文字が続くもの( <math.h> 内);これらの識別子は予約されている可能性あり (C23以降)
    • SIG または SIG_ で始まり、大文字が続くもの( <signal.h> 内)
    • TIME_ で始まり、大文字が続くもの( <time.h> 内) (C11以降)
    • ATOMIC_ で始まり、大文字が続くもの( <stdatomic.h> 内) ;これらの識別子は予約されている可能性あり (C23以降) (C11以降)
  • 列挙定数 (すべて潜在的に予約済み) (C23以降)
    • memory_order_ で始まり小文字が続くもの、 <stdatomic.h> (C11以降)
    • cnd_ mtx_ thrd_ または tss_ で始まり小文字が続くもの、 <threads.h> (C11以降)

実装は、潜在的に予約された識別子の宣言または定義において警告を発することを推奨されます。ただし、以下の場合を除きます:

  • その宣言が、実装によって提供される外部リンケージを持つ識別子の非定義宣言であり、かつ
  • 宣言で使用される型が定義で使用される型と compatible である場合。
(C23以降)

翻訳制限

識別子の長さに特定の制限はありませんが、初期のコンパイラでは識別子の先頭の有効文字数に制限があり、リンカーは 外部リンケージ を持つ名前に対してより厳しい制限を課していました。C言語では、標準に準拠する実装が少なくとも以下の制限をサポートすることを要求しています:

  • 内部識別子またはマクロ名の先頭31文字が有効
  • 外部識別子の先頭6文字が有効
  • 1つの翻訳単位で511個の外部識別子
  • 1つのブロックで127個のブロックスコープ識別子を宣言
  • 1つの前処理翻訳単位で同時に1024個のマクロ識別子を定義
(until C99)
  • 内部識別子またはマクロ名の先頭63文字が有効
  • 外部識別子の先頭31文字が有効
  • 1つの翻訳単位で4095個の外部識別子
  • 1つのブロックで511個のブロックスコープ識別子を宣言
  • 1つの前処理翻訳単位で同時に4095個のマクロ識別子を定義
(since C99)

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 5.2.5.2 翻訳制限 (p: TBD)
  • 6.4.2 識別子 (p: TBD)
  • 6.10.10 定義済みマクロ名 (p: TBD)
  • 6.11.7 定義済みマクロ名 (p: TBD)
  • 7.33 将来のライブラリ方向 (p: TBD)
  • K.3.1.2 予約済み識別子 (p: TBD)
  • C17規格 (ISO/IEC 9899:2018):
  • 5.2.4.1 翻訳限界 (p: 19-20)
  • 6.4.2 識別子 (p: 43)
  • 6.10.8 定義済みマクロ名 (p: 127-129)
  • 6.11.9 定義済みマクロ名 (p: 130)
  • 7.31 将来のライブラリ方向 (p: 332-333)
  • K.3.1.2 予約済み識別子 (p: 425)
  • C11規格 (ISO/IEC 9899:2011):
  • 5.2.4.1 翻訳限界 (p: 25-26)
  • 6.4.2 識別子 (p: 59-60)
  • 6.10.8 定義済みマクロ名 (p: 175-176)
  • 6.11.9 定義済みマクロ名 (p: 179)
  • 7.31 将来のライブラリ方向 (p: 455-457)
  • K.3.1.2 予約済み識別子 (p: 584)
  • C99規格 (ISO/IEC 9899:1999):
  • 5.2.4.1 翻訳制限 (p: 20-21)
  • 6.4.2 識別子 (p: 51-52)
  • 6.10.8 定義済みマクロ名 (p: 160-161)
  • 6.11.9 定義済みマクロ名 (p: 163)
  • 7.26 将来のライブラリ方向 (p: 401-402)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 2.2.4.1 翻訳制限
  • 3.1.2 識別子
  • 3.8.8 定義済みマクロ名

関連項目

C++ documentation for Identifiers
日本語訳:
C++ documentation for Identifiers
HTMLタグ、属性、C++固有の用語("C++ documentation"、"Identifiers")は翻訳せず、元のフォーマットを保持しています。