Namensräume
Varianten
Aktionen

Bezeichner

Von cppreference.com
< c‎ | Sprache

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ängig
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)
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

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)

  1. 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.
  2. Alle externen Bezeichner, die mit einem Unterstrich beginnen.
  3. 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).
  4. 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.
  5. Als reserviert für die Implementierung oder zukünftige Verwendung durch die Standardbibliothek deklarierte Bezeichner (siehe unten).
  6. 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 is oder to gefolgt von einem Kleinbuchstaben in <ctype.h> und <wctype.h>(seit C95)
    • beginnend mit str oder wcs(seit C23) gefolgt von einem Kleinbuchstaben in <stdlib.h> und <inttypes.h>(seit C23)
    • beginnend mit cr_ in <math.h> (seit C23)
    • beginnend mit wcs gefolgt 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_ oder tss_ gefolgt von einem Kleinbuchstaben in <threads.h> (seit C11)
  • typedef-Namen, die alle potenziell reserviert sind(seit C23)
    • beginnend mit int oder uint und endend mit _t in <stdint.h> (seit C99)
    • beginnend mit atomic_ oder memory_ gefolgt von einem Kleinbuchstaben in <stdatomic.h> (seit C11)
    • beginnend mit cnd_, mtx_, thrd_ oder tss_ gefolgt von einem Kleinbuchstaben in <threads.h> (seit C11)
  • Makronamen
    • beginnend mit E gefolgt 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_ oder LDBL_ gefolgt von einem Großbuchstaben in <float.h>; diese Bezeichner sind potenziell reserviert (seit C23)
    • beginnend mit INT oder UINT und endend mit _MAX, _MIN, _WIDTH(seit C23) oder _C in <stdint.h>; diese Bezeichner sind potenziell reserviert(seit C23) (seit C99)
    • beginnend mit PRI oder SCN gefolgt von einem Kleinbuchstaben oder dem Buchstaben X 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 SIG oder SIG_ 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)
  • 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_ oder tss_ gefolgt von einem Kleinbuchstaben in <threads.h> (seit C11)

Implementierungen wird empfohlen, bei der Deklaration oder Definition von potenziell reservierten Bezeichnern eine Warnung auszugeben, außer wenn

  • die Deklaration eine Nicht-Definitions-Deklaration eines Bezeichners mit externer Linkage ist, der von der Implementierung bereitgestellt wird, und
  • der in der Deklaration verwendete Typ kompatibel mit dem in der Definition verwendeten ist.
(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

  • 31 signifikante Anfangszeichen in einem internen Bezeichner oder einem Makronamen
  • 6 signifikante Anfangszeichen in einem externen Bezeichner
  • 511 externe Bezeichner in einer Translation Unit
  • 127 Bezeichner mit Blockgültigkeitsbereich, die in einem Block deklariert sind
  • 1024 Makro-Bezeichner, die gleichzeitig in einer Preprocessing-Translation-Unit definiert sind
(bis C99)
  • 63 signifikante Anfangszeichen in einem internen Bezeichner oder einem Makronamen
  • 31 signifikante Anfangszeichen in einem externen Bezeichner
  • 4095 externe Bezeichner in einer Translation Unit
  • 511 Bezeichner mit Blockgültigkeitsbereich, die in einem Block deklariert sind
  • 4095 Makro-Bezeichner, die gleichzeitig in einer Preprocessing-Translation-Unit definiert sind
(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