名前空間
変種
操作

識別子

From cppreference.com
< c‎ | language

識別子は、任意に長い数字、アンダースコア、小文字と大文字のラテン文字、および\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では、二重アンダースコアで始まる識別子のみが予約されています。

[編集] ライブラリ内の予約済みおよび潜在的に予約済みの識別子

標準ライブラリは、提供するすべての識別子を予約します。外部リンケージを持つ予約済み識別子(例:すべての標準関数の名前)は、どのヘッダーが含まれているかに関係なく予約されます。その他の予約済み識別子は、関連するヘッダーのいずれかが含まれている場合に予約されます。

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

実装は、関数名として予約されている潜在的に予約された識別子の外部定義のみを提供できます。

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

(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以降)
    • <ctype.h> および <wctype.h>(C95以降)の、小文字の後にisまたはtoが続くもの。
    • <stdlib.h> および <inttypes.h>(C23以降)の、小文字の後にstrまたはwcs(C23以降)が続くもの。
    • <math.h>の、cr_で始まるもの (C23以降)
    • <wchar.h>の、wcsの後に小文字が続くもの (C95以降)
    • <stdatomic.h>の、atomic_の後に小文字が続くもの (C11以降)
    • <threads.h>の、cnd_mtx_thrd_、またはtss_の後に小文字が続くもの (C11以降)
  • typedef名、すべて潜在的に予約されています(C23以降)
    • <stdint.h>の、intまたはuintで始まり_tで終わるもの (C99以降)
    • <stdatomic.h>の、atomic_またはmemory_の後に小文字が続くもの (C11以降)
    • <threads.h>の、cnd_mtx_thrd_、またはtss_の後に小文字が続くもの (C11以降)
  • マクロ名
    • <errno.h>の、Eの後に数字または大文字が続くもの
    • <fenv.h>の、FE_の後に大文字が続くもの (C99以降)
    • <float.h>の、DBL_DEC32_DEC64_DEC128_DEC_FLT_、またはLDBL_の後に大文字が続くもの。これらの識別子は潜在的に予約されています。 (C23以降)
    • <stdint.h>の、INTまたはUINTで始まり_MAX_MIN_WIDTH(C23以降)、または_Cで終わるもの。これらの識別子は潜在的に予約されています。(C23以降) (C99以降)
    • <inttypes.h>の、PRIまたはSCNの後に小文字またはXが続くもの。これらの識別子は潜在的に予約されています。(C23以降) (C99以降)
    • <locale.h>の、LC_の後に大文字が続くもの
    • <math.h>の、FP_の後に大文字が続くもの (C23以降)
    • <math.h>の、MATH_の後に大文字が続くもの。これらの識別子は潜在的に予約されています。 (C23以降)
    • <signal.h>の、SIGまたはSIG_の後に大文字が続くもの
    • <time.h>の、TIME_の後に大文字が続くもの (C11以降)
    • <stdatomic.h>の、ATOMIC_の後に大文字が続くもの。これらの識別子は潜在的に予約されています。(C23以降) (C11以降)
  • 列挙定数、すべて潜在的に予約されています(C23以降)
    • <stdatomic.h>の、memory_order_の後に小文字が続くもの (C11以降)
    • <threads.h>の、cnd_mtx_thrd_、またはtss_の後に小文字が続くもの (C11以降)

実装は、以下の状況を除き、潜在的に予約された識別子の宣言または定義時に警告を出すことを推奨します。

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

[編集] 翻訳の制限

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

  • 内部識別子またはマクロ名における有効な初期文字数31文字
  • 外部識別子における有効な初期文字数6文字
  • 1つの翻訳単位における外部識別子511個
  • 1つのブロック内で宣言されたブロックスコープを持つ識別子127個
  • 1つの前処理翻訳単位で同時に定義されたマクロ識別子1024個
(C99まで)
  • 内部識別子またはマクロ名における有効な初期文字数63文字
  • 外部識別子における有効な初期文字数31文字
  • 1つの翻訳単位における外部識別子4095個
  • 1つのブロック内で宣言されたブロックスコープを持つ識別子511個
  • 1つの前処理翻訳単位で同時に定義されたマクロ識別子4095個
(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 プリデファインマクロ名

[編集] 関連項目

English 日本語 中文(简体) 中文(繁體)