Identifier
Ein
Bezeichner
ist eine beliebig lange Folge von Ziffern, Unterstrichen, lateinischen Klein- und Großbuchstaben
, und Unicode-Zeichen, angegeben mit
\u
und
\U
Escape
-Notation
(seit C99)
, der Klasse
XID_Continue
(seit C23)
. Ein gültiger Bezeichner muss mit einem Nicht-Ziffern-Zeichen beginnen (lateinischer Buchstabe, Unterstrich
, oder Unicode-Nicht-Ziffern-Zeichen
(seit C99)
(bis C23)
, oder Unicode-Zeichen der Klasse
XID_Start
)
(seit C23)
). Bezeichner sind case-sensitive (Klein- und Großbuchstaben sind unterscheidbar).
Jeder Bezeichner muss
Normalization Form C
entsprechen.
(seit C23)
Es ist implementierungsdefiniert, ob rohe (nicht maskierte) Unicode-Zeichen in Bezeichnern erlaubt sind:
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 |
(seit C99)
(bis C23) |
| Implementierungsdefinierte Zeichen, deren entsprechende Codepoints in ISO/IEC 10646 (Unicode) die XID_Start- oder XID_Continue-Eigenschaft besitzen, können am Anfang bzw. nach dem ersten Zeichen eines Bezeichners erscheinen. | (seit C23) |
Bezeichner können die folgenden Arten von Entitäten bezeichnen:
- Objekte
- Funktionen
- Tags ( struct , union , oder enumerations )
- Struktur- oder Union-Mitglieder
- Enumerationskonstanten
- typedef Namen
- Label Namen
- Makro Namen
- Makroparameter Namen
Jeder Bezeichner außer Makronamen oder Makroparameternamen hat einen Gültigkeitsbereich , gehört zu einem Namensraum und kann eine Bindung aufweisen. Derselbe Bezeichner kann an verschiedenen Stellen im Programm verschiedene Entitäten bezeichnen oder kann an derselben Stelle verschiedene Entitäten bezeichnen, wenn sich die Entitäten in unterschiedlichen Namensräumen befinden.
Inhaltsverzeichnis |
Reservierte Bezeichner
Die folgenden Bezeichner sind reserviert und dürfen nicht in einem Programm deklariert werden (dies führt zu undefiniertem Verhalten):
- Die Bezeichner, die Schlüsselwörter sind, können nicht für andere Zwecke verwendet werden. Insbesondere ist #define oder #undef eines Bezeichners, der identisch mit einem Schlüsselwort ist, nicht erlaubt.
- Alle externen Bezeichner, die mit einem Unterstrich beginnen.
- Alle Bezeichner, die mit einem Unterstrich gefolgt von einem Großbuchstaben oder einem weiteren Unterstrich beginnen (diese reservierten Bezeichner ermöglichen es der Bibliothek, zahlreiche interne nicht-externe Makros und Funktionen zu verwenden).
- Alle externen Bezeichner, die von der Standardbibliothek definiert sind (in gehosteter Umgebung). Dies bedeutet, dass keine benutzerdefinierten externen Namen mit Bibliotheksnamen übereinstimmen dürfen, selbst dann nicht, wenn eine Funktion deklariert wird, die identisch mit einer Bibliotheksfunktion ist.
- Bezeichner, die als für die Implementierung reserviert oder für zukünftige Verwendung durch die Standardbibliothek deklariert sind (siehe unten).
- Bezeichner, die als potenziell reserviert deklariert und von der Implementierung bereitgestellt werden (siehe unten). (since C23)
Alle anderen Bezeichner sind verfügbar. Bezeichner, die nicht reserviert oder potenziell reserviert sind (seit C23) können ohne Angst vor unerwarteten Kollisionen verwendet werden, wenn Programme von einem Compiler und einer Bibliothek zu einem anderen übertragen werden.
Hinweis: In C++ sind Bezeichner mit einem doppelten Unterstrich überall reserviert; in C sind nur diejenigen reserviert, die mit einem doppelten Unterstrich beginnen.
Reservierte und potenziell reservierte Bezeichner in der Bibliothek
Die Standardbibliothek reserviert jeden Bezeichner, den sie bereitstellt. Reservierte Bezeichner mit externer Verknüpfung (z.B. Namen jeder Standardfunktion) sind unabhängig davon reserviert, welche Header-Datei eingebunden wird. Andere reservierte Bezeichner sind reserviert, wenn eine ihrer zugehörigen Header-Dateien eingebunden wird.
|
Potenziell reservierte Bezeichner sind für die Verwendung durch die Implementierung und zukünftige Revisionen des Standards vorgesehen. Wenn ein potenziell reservierter Bezeichner durch die Implementierung bereitgestellt wird, wird er reserviert. Implementierungen dürfen nur externe Definitionen von potenziell reservierten Bezeichnern bereitstellen, die als Funktionsnamen reserviert sind. Potenziell reservierte Bezeichner, die nicht durch die Implementierung bereitgestellt werden, sind nicht reserviert. Sie können vom Benutzer deklariert oder definiert werden, ohne undefiniertes Verhalten zu verursachen. Eine solche Verwendung ist jedoch nicht portabel. |
(seit C23) |
Folgende Bezeichner sind reserviert oder potenziell reserviert (since C23) für die Implementierung oder zukünftige Verwendung durch die Standardbibliothek.
-
Funktionsnamen
, die alle potenziell reserviert sind
(seit 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(seit C23) und ihre -f und -l Varianten mit Suffix, in <complex.h> (seit C99) -
beginnend mit
isodertogefolgt von einem Kleinbuchstaben, in <ctype.h> und <wctype.h> (seit C95) -
beginnend mit
stroderwcs(seit C23) gefolgt von einem Kleinbuchstaben, in <stdlib.h> und <inttypes.h> (seit C23) -
beginnend mit
cr_, in <math.h> (seit C23) -
beginnend mit
wcsgefolgt von einem Kleinbuchstaben, in <wchar.h> (seit C95) -
beginnend mit
atomic_gefolgt von einem Kleinbuchstaben, in <stdatomic.h> (seit C11) -
beginnend mit
cnd_,mtx_,thrd_odertss_gefolgt von einem Kleinbuchstaben, in <threads.h> (seit C11)
-
-
Typedef-Namen
, die alle potenziell reserviert sind
(seit C23)
-
beginnend mit
intoderuintund endend mit_t, in <stdint.h> (seit C99) -
beginnend mit
atomic_odermemory_gefolgt von einem Kleinbuchstaben, in <stdatomic.h> (seit C11) -
beginnend mit
cnd_,mtx_,thrd_odertss_gefolgt von einem Kleinbuchstaben, in <threads.h> (seit C11)
-
beginnend mit
-
Makronamen
-
beginnend mit
Egefolgt von einer Ziffer oder einem Großbuchstaben, in <errno.h> -
beginnend mit
FE_gefolgt von einem Großbuchstaben, in <fenv.h> (seit C99) -
beginnend mit
DBL_,DEC32_,DEC64_,DEC128_,DEC_,FLT_, oderLDBL_gefolgt von einem Großbuchstaben, in <float.h> ; diese Bezeichner sind potenziell reserviert (seit C23) -
beginnend mit
INToderUINTund endend mit_MAX,_MIN,_WIDTH(seit C23) , oder_C, in <stdint.h> ; diese Bezeichner sind potenziell reserviert (seit C23) (seit C99) -
beginnend mit
PRIoderSCNgefolgt von einem Kleinbuchstaben oder dem BuchstabenX, in <inttypes.h> ; diese Bezeichner sind potenziell reserviert (seit C23) (seit C99) -
beginnend mit
LC_gefolgt von einem Großbuchstaben, in <locale.h> -
beginnend mit
FP_gefolgt von einem Großbuchstaben, in <math.h> (seit C23) -
beginnend mit
MATH_gefolgt von einem Großbuchstaben, in <math.h> ; diese Bezeichner sind potenziell reserviert (seit C23) -
beginnend mit
SIGoderSIG_gefolgt von einem Großbuchstaben, in <signal.h> -
beginnend mit
TIME_gefolgt von einem Großbuchstaben, in <time.h> (seit C11) -
beginnend mit
ATOMIC_gefolgt von einem Großbuchstaben, in <stdatomic.h> ; diese Bezeichner sind potenziell reserviert (seit C23) (seit C11)
-
beginnend mit
-
Aufzählungskonstanten
, die alle potenziell reserviert sind
(seit C23)
-
beginnend mit
memory_order_gefolgt von einem Kleinbuchstaben, in <stdatomic.h> (seit C11) -
beginnend mit
cnd_,mtx_,thrd_odertss_gefolgt von einem Kleinbuchstaben, in <threads.h> (seit C11)
-
beginnend mit
|
Implementierungen wird empfohlen, bei der Deklaration oder Definition potenziell reservierter Identifier zu warnen, außer wenn
|
(seit C23) |
Übersetzungsgrenzen
Obwohl es keine spezifische Begrenzung für die Länge von Bezeichnern gibt, hatten frühe Compiler Beschränkungen für die Anzahl signifikanter Anfangszeichen in Bezeichnern, und die Linker legten strengere Grenzen für Namen mit externer Verknüpfung fest. C erfordert, dass mindestens die folgenden Grenzen von jeder standardkonformen Implementierung unterstützt werden:
|
(bis C99) |
|
(seit C99) |
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 5.2.5.2 Übersetzungslimits (S: TBD)
-
- 6.4.2 Bezeichner (S: TBD)
-
- 6.10.10 Vordefinierte Makronamen (S: TBD)
-
- 6.11.7 Vordefinierte Makronamen (S: TBD)
-
- 7.33 Zukünftige Bibliotheksrichtungen (S: TBD)
-
- K.3.1.2 Reservierte Bezeichner (S: TBD)
- C17-Standard (ISO/IEC 9899:2018):
-
- 5.2.4.1 Übersetzungsgrenzen (S: 19-20)
-
- 6.4.2 Bezeichner (S: 43)
-
- 6.10.8 Vordefinierte Makronamen (S: 127-129)
-
- 6.11.9 Vordefinierte Makronamen (S: 130)
-
- 7.31 Zukünftige Bibliotheksrichtungen (S: 332-333)
-
- K.3.1.2 Reservierte Bezeichner (S: 425)
- C11-Standard (ISO/IEC 9899:2011):
-
- 5.2.4.1 Übersetzungsgrenzen (S: 25-26)
-
- 6.4.2 Bezeichner (S: 59-60)
-
- 6.10.8 Vordefinierte Makronamen (S: 175-176)
-
- 6.11.9 Vordefinierte Makronamen (S: 179)
-
- 7.31 Zukünftige Bibliotheksrichtungen (S: 455-457)
-
- K.3.1.2 Reservierte Bezeichner (S: 584)
- C99-Standard (ISO/IEC 9899:1999):
-
- 5.2.4.1 Übersetzungslimits (S: 20-21)
-
- 6.4.2 Bezeichner (S: 51-52)
-
- 6.10.8 Vordefinierte Makronamen (S: 160-161)
-
- 6.11.9 Vordefinierte Makronamen (S: 163)
-
- 7.26 Zukünftige Bibliotheksrichtungen (S: 401-402)
- C89/C90 Standard (ISO/IEC 9899:1990):
-
- 2.2.4.1 Übersetzungslimits
-
- 3.1.2 Bezeichner
-
- 3.8.8 Vordefinierte Makronamen
Siehe auch
|
C++ Dokumentation
für
Identifiers
|