識別子
提供: cppreference.com
識別子は数字、アンダースコア、大小ラテン文字、 \u および \U 表記を用いて指定された Unicode 文字 (C99以上)の任意の長さの並びです。 有効な識別子は数字以外の文字 (ラテン文字、アンダースコア、数字以外の Unicode 文字 (C99以上)) で始まらなければなりません。 識別子の大文字と小文字は区別されます。
|
識別子に生の (エスケープされていない) Unicode 文字が使用できるかどうかは処理系定義です。 char *\U0001f431 = "cat"; // OK。
char *🐱 = "cat"; // 処理系定義 (例えば Clang では動きますが GCC では動きません)。
|
(C99以上) |
識別子は以下の種類のエンティティを表すことができます。
マクロ名およびマクロ引数名以外のすべての識別子はスコープを持ち、名前空間に属し、場合によってはリンケージを持ちます。 同じ識別子がプログラム内の異なる場所で異なるエンティティを表したり、同じ場所で異なるエンティティを表す (エンティティが異なる名前空間にある場合) こともあります。
予約された識別子
以下の識別子は予約されており、プログラム内で宣言してはなりません (宣言すると未定義動作を発生させます)。
1) キーワードである識別子は、他の目的には使用できません。 特に、キーワードと同一の識別子の #define および #undef は許されません。
2) アンダースコアで始まるすべての外部識別子。
3) アンダースコアとそれに続く大文字または別のアンダースコアで始まるすべての識別子 (これらの予約された識別子はライブラリが様々な非外部マクロおよび関数を水面下で使用するためのものです)。
4) 標準ライブラリによって定義されるすべての外部識別子 (ホスト環境の場合)。 これは、ユーザ供給の外部名はいかなるライブラリ供給の外部名ともマッチしてはならないことを意味します (たとえライブラリ関数と同一の関数を宣言するのであっても)。
5) 将来標準ライブラリが使用するために予約されていると宣言されている識別子。 具体的には、
- 関数名
cerf、cerfc、cexp2、cexpm1、clog10、clog1p、clog2、clgamma、ctgammaおよびそれらの ~f 版および ~l 版 (<complex.h>)。isまたはtoとそれに続く小文字で始まる名前 (<ctype.h> および <wctype.h>)。strとそれに続く小文字で始まる名前 (<stdlib.h>)。str、memまたは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 ではあらゆる標準準拠の処理系は少なくとも以下の限界をサポートすることが要求されます。
|
(C99未満) |
|
(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++リファレンス
|