?
This document uses PHP Chinese website manual Release
一個(gè)標(biāo)識(shí)符是任意長(zhǎng)的數(shù)字序列,下劃線,小寫(xiě)和大寫(xiě)拉丁字母,并且使用 Unicode 字符指定\u
和\U
逃逸符號(hào)(自 C99)。有效的標(biāo)識(shí)符必須以非數(shù)字字符(拉丁字母,下劃線或 Unicode 非數(shù)字字符(自C99以來(lái))開(kāi)始)。標(biāo)識(shí)符區(qū)分大小寫(xiě)(小寫(xiě)和大寫(xiě)字母不同)。
如果在標(biāo)識(shí)符中允許原始(未轉(zhuǎn)義的)Unicode字符,則它是實(shí)現(xiàn)定義的:char * \ U0001f431 =“cat”; //支持char *?=“貓”; //實(shí)現(xiàn)定義(例如,與Clang一起工作,但不是GCC) | (自C99以來(lái)) |
---|
標(biāo)識(shí)符可以表示以下類型的實(shí)體:
對(duì)象
功能
標(biāo)記(結(jié)構(gòu),聯(lián)合或枚舉)
結(jié)構(gòu)或聯(lián)盟成員
枚舉常量
typedef名稱
標(biāo)簽名稱
宏名稱
宏參數(shù)名稱
除宏名稱或宏參數(shù)名以外的每個(gè)標(biāo)識(shí)符都具有范圍,屬于名稱空間,并且可能具有鏈接。如果實(shí)體位于不同的名稱空間中,相同的標(biāo)識(shí)符可以表示程序中不同點(diǎn)處的不同實(shí)體,或者可以表示同一點(diǎn)處的不同實(shí)體。
以下標(biāo)識(shí)符是保留的,不能在程序中聲明(這樣做會(huì)調(diào)用未定義的行為):
1)作為關(guān)鍵字的標(biāo)識(shí)符不能用于其他目的。特別是 #define 或 #undef 與一個(gè)關(guān)鍵字相同的標(biāo)識(shí)符是不允許的。
2)以下劃線開(kāi)頭的所有外部標(biāo)識(shí)符。
3)以下劃線開(kāi)頭的所有標(biāo)識(shí)符,后跟大寫(xiě)字母或其他下劃線(這些保留的標(biāo)識(shí)符允許庫(kù)使用大量幕后的非外部宏和函數(shù))
4)由標(biāo)準(zhǔn)庫(kù)定義的所有外部標(biāo)識(shí)符(在托管環(huán)境中)。這意味著不允許用戶提供的外部名稱與任何庫(kù)名稱匹配,即使聲明與庫(kù)函數(shù)相同的函數(shù)也是如此。
5)標(biāo)識(shí)符被聲明為保留以供將來(lái)由標(biāo)準(zhǔn)庫(kù)使用,即
函數(shù)名稱
cerf
,cerfc
,cexp2
,cexpm1
,clog10
,clog1p
,clog2
,clgamma
,ctgamma
和他們-f -l和后綴的變體,在<complex.h>
開(kāi)頭is
或to
后面跟著一個(gè)小寫(xiě)字母,in <ctype.h>
和wctype.h
str
以小寫(xiě)字母開(kāi)頭,后面跟著一個(gè)小寫(xiě)字母<stdlib.h>
開(kāi)頭str
,mem
或wcs
后跟一個(gè)小寫(xiě)字母,在<string.h>
wcs
以小寫(xiě)字母開(kāi)頭,后面跟著一個(gè)小寫(xiě)字母<wchar.h>
atomic_
以小寫(xiě)字母開(kāi)頭,后面跟著一個(gè)小寫(xiě)字母<stdatomic.h>
開(kāi)頭cnd_
,mtx_
,thrd_
或tss_
后跟一個(gè)小寫(xiě)字母,在<threads.h>
typedef名稱
開(kāi)頭int
或uint
和結(jié)尾_t
,在<stdint.h>
以小寫(xiě)字母開(kāi)頭atomic_
或memory_
后面跟著一個(gè)小寫(xiě)字母<stdatomic.h>
開(kāi)頭cnd_
,mtx_
,thrd_
或tss_
后跟一個(gè)小寫(xiě)字母,在<threads.h>
宏名稱
E
以數(shù)字或大寫(xiě)字母開(kāi)頭,后面跟著一個(gè)數(shù)字或一個(gè)大寫(xiě)字母<errno.h>
FE_
以大寫(xiě)字母開(kāi)頭,后面跟著一個(gè)大寫(xiě)字母<fenv.h>
開(kāi)頭INT
或UINT
與結(jié)尾_MAX
,_MIN
或_C
在<stdint.h>
開(kāi)頭PRI
或SCN
后跟小寫(xiě)字母或字母X
,在<stdint.h>
LC_
以大寫(xiě)字母開(kāi)頭,后面跟著一個(gè)大寫(xiě)字母<locale.h>
以大寫(xiě)字母開(kāi)頭SIG
或SIG_
后面跟著一個(gè)大寫(xiě)字母<signal.h>
開(kāi)始與TIME_
后跟大寫(xiě)字母,在<time.h>中
ATOMIC_
以大寫(xiě)字母開(kāi)頭,后面跟著一個(gè)大寫(xiě)字母<stdatomic.h>
枚舉常量
memory_order_
以小寫(xiě)字母開(kāi)頭,后面跟著一個(gè)小寫(xiě)字母<stdatomic.h>
開(kāi)頭cnd_
,mtx_
,thrd_
或tss_
后跟一個(gè)小寫(xiě)字母,在<threads.h>
所有其他標(biāo)識(shí)符都可用,不必?fù)?dān)心在將程序從一個(gè)編譯器和庫(kù)移動(dòng)到另一個(gè)編譯器和庫(kù)時(shí)發(fā)生意外沖突。
注意:在C ++中,任何地方都帶有雙下劃線的標(biāo)識(shí)符都是保留的; 在C中,只保留以雙下劃線開(kāi)頭的那些。
即使對(duì)標(biāo)識(shí)符的長(zhǎng)度沒(méi)有特別的限制,早期編譯器對(duì)標(biāo)識(shí)符中重要的初始字符的數(shù)量也有限制,連接器對(duì)外部鏈接的名稱施加了更嚴(yán)格的限制。C要求任何符合標(biāo)準(zhǔn)的實(shí)現(xiàn)至少支持以下限制:
內(nèi)部標(biāo)識(shí)符或宏名稱中的31個(gè)重要初始字符外部標(biāo)識(shí)符中的6個(gè)重要初始字符511個(gè)一個(gè)翻譯單元中的外部標(biāo)識(shí)符127個(gè)在一個(gè)塊中聲明塊范圍的標(biāo)識(shí)符在一個(gè)預(yù)處理翻譯單元中同時(shí)定義的1024個(gè)宏標(biāo)識(shí)符 | (直到C99) |
---|---|
內(nèi)部標(biāo)識(shí)符或宏名稱中的63個(gè)重要起始字符外部標(biāo)識(shí)符中的31個(gè)重要起始字符4095一個(gè)翻譯單元中的外部標(biāo)識(shí)符511個(gè)在一個(gè)塊中聲明塊范圍的標(biāo)識(shí)符4095在一個(gè)預(yù)處理翻譯單元中同時(shí)定義的宏標(biāo)識(shí)符 | (自C99以來(lái)) |
內(nèi)部標(biāo)識(shí)符或宏名稱中的31個(gè)重要的初始字符
外部標(biāo)識(shí)符中有6個(gè)重要的初始字符
一個(gè)翻譯單元中有511個(gè)外部標(biāo)識(shí)符
在一個(gè)塊中聲明塊范圍的127個(gè)標(biāo)識(shí)符
在一個(gè)預(yù)處理翻譯單元中同時(shí)定義了1024個(gè)宏標(biāo)識(shí)符
(until C99)
內(nèi)部標(biāo)識(shí)符或宏名稱中有63個(gè)重要的初始字符
外部標(biāo)識(shí)符中有31個(gè)重要的初始字符
一個(gè)翻譯單元中包含4095個(gè)外部標(biāo)識(shí)符
在一個(gè)塊中聲明塊范圍的511個(gè)標(biāo)識(shí)符
在一個(gè)預(yù)處理翻譯單元中同時(shí)定義了4095個(gè)宏標(biāo)識(shí)符
(since 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