名前空間
変種
操作

識別子

提供: cppreference.com
< c‎ | language

識別子は数字、アンダースコア、大小ラテン文字\u および \U 表記を用いて指定された Unicode 文字 (C99以上)の任意の長さの並びです。 有効な識別子は数字以外の文字 (ラテン文字、アンダースコア、数字以外の Unicode 文字 (C99以上)) で始まらなければなりません。 識別子の大文字と小文字は区別されます。

識別子に生の (エスケープされていない) Unicode 文字が使用できるかどうかは処理系定義です。

char *\U0001f431 = "cat"; // OK。
char *🐱 = "cat"; // 処理系定義 (例えば Clang では動きますが GCC では動きません)。
(C99以上)

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

マクロ名およびマクロ引数名以外のすべての識別子はスコープを持ち、名前空間に属し、場合によってはリンケージを持ちます。 同じ識別子がプログラム内の異なる場所で異なるエンティティを表したり、同じ場所で異なるエンティティを表す (エンティティが異なる名前空間にある場合) こともあります。

目次

[編集] 予約された識別子

以下の識別子は予約されており、プログラム内で宣言してはなりません (宣言すると未定義動作を発生させます)。

1) キーワードである識別子は、他の目的には使用できません。 特に、キーワードと同一の識別子の #define および #undef は許されません。
2) アンダースコアで始まるすべての外部識別子。
3) アンダースコアとそれに続く大文字または別のアンダースコアで始まるすべての識別子 (これらの予約された識別子はライブラリが様々な非外部マクロおよび関数を水面下で使用するためのものです)。
4) 標準ライブラリによって定義されるすべての外部識別子 (ホスト環境の場合)。 これは、ユーザ供給の外部名はいかなるライブラリ供給の外部名ともマッチしてはならないことを意味します (たとえライブラリ関数と同一の関数を宣言するのであっても)。
5) 将来標準ライブラリが使用するために予約されていると宣言されている識別子。 具体的には、
  • 関数名
  • cerfcerfccexp2cexpm1clog10clog1pclog2clgammactgamma およびそれらの ~f 版および ~l 版 (<complex.h>)。
  • is または to とそれに続く小文字で始まる名前 (<ctype.h> および <wctype.h>)。
  • str とそれに続く小文字で始まる名前 (<stdlib.h>)。
  • strmem または wcs とそれに続く小文字で始まる名前 (<string.h>)。
  • wcs とそれに続く小文字で始まる名前 (<wchar.h>)。
  • atomic_ とそれに続く小文字で始まる名前 (<stdatomic.h>)。
  • cnd_mtx_thrd_ または tss_ とそれに続く小文字で始まる名前 (<threads.h>)。
  • typedef名
  • int または uint で始まり _t で終わる名前 (<stdint.h>)。
  • atomic_ または memory_ とそれに続く小文字で始まる名前 (<stdatomic.h>)。
  • cnd_mtx_thrd_ または tss_ とそれに続く小文字で始まる名前 (<threads.h>)。
  • マクロ名
  • E とそれに続く数字または大文字で始まり名前名前 (<errno.h>)。
  • FE_ とそれに続く大文字で始まる名前 (<fenv.h>)。
  • INT または UINT で始まり _MAX_MIN、または _C で終わる名前 (<stdint.h>)。
  • PRI または SCN とそれに続く小文字または X で始まる名前 (<stdint.h>)。
  • LC_ とそれに続く大文字で始まる名前名前 (<locale.h>)。
  • SIG または SIG_ とそれに続く大文字で始まる名前 (<signal.h>)。
  • TIME_ とそれに続く大文字で始まる名前 (<time.h>)。
  • ATOMIC_ とそれに続く大文字で始まる名前 (<stdatomic.h>)。
  • 列挙定数
  • memory_order_ とそれに続く小文字で始まる名前 (<stdatomic.h>)。
  • cnd_mtx_,、thrd_ または tss_ とそれに続く小文字で始まる名前 (<threads.h>)。

それ以外もすべての識別子が使用でき、あるコンパイラとライブラリから別のコンパイラとライブラリへとプログラムを移行したときの予期しない衝突の恐れはありません。

ノート: C++ では、2個のアンダースコアを任意の位置に含む識別子はすべての場所で予約されています。 C では、2個のアンダースコアで始まる識別子のみ予約されています。

[編集] 翻訳の限界

識別子の長さの限界は規定されていませんが、初期のコンパイラには識別子内の意味を持つ先頭文字数に制限があり、外部リンケージを持つ名前はリンカによってさらに厳しい制限が課されていました。 C ではあらゆる標準準拠の処理系は少なくとも以下の限界をサポートすることが要求されます。

  • 内部識別子またはマクロ名の意味を持つ先頭文字数 31
  • 外部識別子の意味を持つ先頭文字数 6
  • ひとつの翻訳単位内の外部識別子の数 511
  • ひとつのブロック内のブロックスコープを持つ識別子の数 127
  • ひとつのプリプロセス中の翻訳単位内で同時に定義されるマクロ識別子の数 1024
(C99未満)
  • 内部識別子またはマクロ名の意味を持つ先頭文字数 63
  • 外部識別子の意味を持つ先頭文字数 31
  • ひとつの翻訳単位内の外部識別子の数 4095
  • ひとつのブロック内のブロックスコープを持つ識別子の数 511
  • ひとつのプリプロセス中の翻訳単位内で同時に定義されるマクロ識別子の数 4095
(C99以上)

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 5.2.4.1 Translation limits (p: 25-26)
  • 6.4.2 Identifiers (p: 59-60)
  • 6.10.8 Predefined macro names (p: 175-176)
  • 6.11.9 Predefined macro names (p: 179)
  • 7.31 Future library directions (p: 455-457)
  • K.3.1.2 Reserved identifiers (p: 584)
  • C99 standard (ISO/IEC 9899:1999):
  • 5.2.4.1 Translation limits (p: 20-21)
  • 6.4.2 Identifiers (p: 51-52)
  • 6.10.8 Predefined macro names (p: 160-161)
  • 6.11.9 Predefined macro names (p: 163)
  • 7.26 Future library directions (p: 401-402)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 2.2.4.1 Translation limits
  • 3.1.2 Identifiers
  • 3.8.8 Predefined macro names

[編集] 関連項目

識別子C++リファレンス