識別碼
識別子是一個任意長度的序列,由數字、底線、小寫及大寫拉丁字母組成,以及使用 \u 與 \U 跳脫表示法指定的 Unicode 字元(C99 起),並屬於 XID_Continue 類別(C23 起)。有效的識別子必須以非數字字元開頭(拉丁字母、底線,或 Unicode 非數字字元(C99 起)(C23 止),或屬於 XID_Start 類別的 Unicode 字元(C23 起))。識別子區分大小寫(小寫與大寫字母視為不同)。每個識別子必須符合 Normalization Form 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 起) |
識別子可以表示下列類型的實體:
除巨集名稱或巨集參數名稱外,每個識別子皆有作用域,屬於某個命名空間,並可能具有連結性。同一個識別子在程式的不同位置可表示不同的實體,若實體位於不同的命名空間中,則在同一位置亦可表示不同的實體。
目錄 |
[編輯] 保留識別子
下列識別子為保留的,不得在程式中宣告(如此做會引發未定義行為):
- 身為關鍵字的識別子不得用於其他用途。特別是,禁止對與關鍵字相同的識別子進行 #define 或 #undef。
- 所有以底線開頭的外部識別子。
- 所有以底線開頭並隨後緊接大寫字母或另一個底線的識別子(這些保留識別子允許程式庫使用大量的後台非外部巨集與函式)。
- 標準程式庫定義的所有外部識別子(在託管環境中)。這意味著使用者提供的外部名稱不得與任何程式庫名稱相符,即使是宣告與程式庫函式相同的函式也不允許。
- 聲明為由實作保留,或由標準程式庫未來使用的識別子(見下文)。
- 聲明為潛在保留並由實作提供的識別子(見下文)。 (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 起)- 以
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 標準要求任何符合標準的實作皆須支援下列至少這些限制:
|
(直到 C99) |
|
(自 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++ 文件 關於 識別子
|