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