Identifier
識別子
は、数字、アンダースコア、ラテン文字の小文字と大文字
、および
\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以降) |
識別子は以下の種類のエンティティを表すことができます:
- objects
- functions
- タグ ( struct , union , または enumerations )
- 構造体または共用体のメンバ
- 列挙定数
- typedef 名
- label 名
- macro 名
- macro parameter 名
マクロ名またはマクロパラメータ名以外のすべての識別子は、 スコープ を持ち、 名前空間 に属し、 リンケージ を持つ場合があります。同じ識別子がプログラム内の異なるポイントで異なるエンティティを表すことができ、また、エンティティが異なる名前空間にある場合には同じポイントで異なるエンティティを表すことも可能です。
目次 |
予約識別子
以下の識別子は 予約済み であり、プログラム内で宣言することはできません(これを行うと未定義動作を引き起こします):
- キーワード である識別子は他の目的に使用できません。特に、キーワードと同一の識別子の#defineや#undefは許可されません。
- アンダースコアで始まるすべての外部識別子。
- アンダースコアに続いて大文字または別のアンダースコアが続くすべての識別子(これらの予約済み識別子により、ライブラリは多数の内部非外部マクロや関数を使用できます)。
- 標準ライブラリで定義されているすべての外部識別子(ホスト環境において)。これは、ユーザーが提供する外部名がライブラリ名と一致してはならないことを意味し、ライブラリ関数と同一の関数を宣言する場合でも同様です。
- 実装または将来の標準ライブラリでの使用のために予約されていると宣言された識別子(下記参照)。
- 実装によって提供され、潜在的に予約されていると宣言された識別子(下記参照)。 (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以降)
-
|
実装は、潜在的に予約された識別子の宣言または定義において警告を発することを推奨されます。ただし、以下の場合を除きます:
|
(C23以降) |
翻訳制限
識別子の長さに特定の制限はありませんが、初期のコンパイラでは識別子の先頭の有効文字数に制限があり、リンカーは 外部リンケージ を持つ名前に対してより厳しい制限を課していました。C言語では、標準に準拠する実装が少なくとも以下の制限をサポートすることを要求しています:
|
(until C99) |
|
(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
|