Bezeichner
Ein Bezeichner ist eine beliebig lange Folge von Ziffern, Unterstrichen, Klein- und Großbuchstaben von lateinischen Buchstabenund Unicode-Zeichen, die mit \u und \U Escape-Notation spezifiziert werden(seit C99)und der Klasse XID_Continue angehören(seit C23). Ein gültiger Bezeichner muss mit einem Nicht-Ziffern-Zeichen beginnen (lateinischer Buchstabe, Unterstrichoder ein nicht-ziffernbasiertes Unicode-Zeichen(seit C99)(bis C23)oder ein Unicode-Zeichen der Klasse XID_Start)(seit C23). Bezeichner sind case-sensitiv (Klein- und Großbuchstaben sind unterschiedlich). Jeder Bezeichner muss der Normalisierungsform C entsprechen.(seit C23)
Ob rohe (nicht maskierte) Unicode-Zeichen in Bezeichnern zulässig sind, ist implementierungsabhängigchar *\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) |
| Implementierungsabhängige Zeichen, deren entsprechende Codepunkte in ISO/IEC 10646 (Unicode) die Eigenschaft XID_Start oder XID_Continue haben, können am Anfang bzw. nach dem ersten Zeichen eines Bezeichners erscheinen. | (seit C23) |
Bezeichner können die folgenden Entitätstypen 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 Linkage haben. Derselbe Bezeichner kann an verschiedenen Stellen im Programm unterschiedliche Entitäten bezeichnen oder an derselben Stelle unterschiedliche Entitäten bezeichnen, wenn die Entitäten sich in verschiedenen Namensräumen befinden.
Inhalt |
[bearbeiten] Reservierte Bezeichner
Die folgenden Bezeichner sind reserviert und dürfen nicht in einem Programm deklariert werden (andernfalls kommt es zu undefiniertem Verhalten)
- Die Bezeichner, die Schlüsselwörter sind, dürfen 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 der Bibliothek die Verwendung zahlreicher interner Makros und Funktionen im Hintergrund).
- Alle externen Bezeichner, die von der Standardbibliothek definiert werden (in gehosteten Umgebungen). Das bedeutet, dass keine vom Benutzer bereitgestellten externen Namen mit Bibliotheksnamen übereinstimmen dürfen, selbst wenn eine Funktion deklariert wird, die identisch mit einer Bibliotheksfunktion ist.
- Als reserviert für die Implementierung oder zukünftige Verwendung durch die Standardbibliothek deklarierte Bezeichner (siehe unten).
- Als potenziell reserviert deklarierte und von der Implementierung bereitgestellte Bezeichner (siehe unten). (seit C23)
Alle anderen Bezeichner sind verfügbar. Bezeichner, die nicht reserviert oder potenziell reserviert sind(seit C23), können ohne Angst vor unerwarteten Kollisionen bei der Übertragung von Programmen von einem Compiler und einer Bibliothek zu einer anderen verwendet werden.
Hinweis: In C++ sind Bezeichner mit einem doppelten Unterstrich irgendwo reserviert; in C sind nur diejenigen reserviert, die mit einem doppelten Unterstrich beginnen.
[bearbeiten] Reservierte und potenziell reservierte Bezeichner in der Bibliothek
Die Standardbibliothek reserviert jeden von ihr bereitgestellten Bezeichner. Reservierte Bezeichner, die eine externe Linkage haben (z.B. Name 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 von der 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 von der Implementierung bereitgestellt werden, sind nicht reserviert. Sie können vom Benutzer ohne undefiniertes Verhalten deklariert oder definiert werden. Eine solche Verwendung ist jedoch nicht portabel. |
(seit C23) |
Folgende Bezeichner sind oder potenziell reserviert(seit C23) für die Implementierung oder zukünftige Verwendung durch die Standardbibliothek reserviert.
- 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 suffigierten Varianten 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_tin <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_Cin <stdint.h>; diese Bezeichner sind potenziell reserviert(seit C23) (seit C99) - beginnend mit
PRIoderSCNgefolgt von einem Kleinbuchstaben oder dem BuchstabenXin <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
- Enumerationskonstanten, 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 von potenziell reservierten Bezeichnern eine Warnung auszugeben, außer wenn
|
(seit C23) |
[bearbeiten] Übersetzungsbeschränkungen
Obwohl es keine spezifische Längenbeschränkung für Bezeichner gibt, hatten frühe Compiler Beschränkungen für die Anzahl der signifikanten Anfangszeichen in Bezeichnern und Linker auferlegten strengere Beschränkungen für Namen mit externer Linkage. C schreibt vor, dass zumindest die folgenden Grenzen von jeder standardkonformen Implementierung unterstützt werden müssen
|
(bis C99) |
|
(seit C99) |
[bearbeiten] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- 5.2.5.2 Translation limits (p: TBD)
- 6.4.2 Identifiers (p: TBD)
- 6.10.10 Predefined macro names (p: TBD)
- 6.11.7 Predefined macro names (p: TBD)
- 7.33 Future library directions (p: TBD)
- K.3.1.2 Reserved identifiers (p: TBD)
- C17-Standard (ISO/IEC 9899:2018)
- 5.2.4.1 Translation limits (p: 19-20)
- 6.4.2 Identifiers (p: 43)
- 6.10.8 Predefined macro names (p: 127-129)
- 6.11.9 Predefined macro names (p: 130)
- 7.31 Future library directions (p: 332-333)
- K.3.1.2 Reserved identifiers (p: 425)
- 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
[bearbeiten] Siehe auch
| C++ Dokumentation für Bezeichner
|