Namespaces
Variants

Identifier

From cppreference.net

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:

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):

  1. 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.
  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 es der Bibliothek, zahlreiche interne nicht-externe Makros und Funktionen zu verwenden).
  4. 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.
  5. Bezeichner, die als für die Implementierung reserviert oder für zukünftige Verwendung durch die Standardbibliothek deklariert sind (siehe unten).
  6. 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 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)
  • 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_ oder tss_ gefolgt von einem Kleinbuchstaben, in <threads.h> (seit C11)

Implementierungen wird empfohlen, bei der Deklaration oder Definition potenziell reservierter Identifier zu warnen, außer wenn

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

  • 31 signifikante Anfangszeichen in einem internen Bezeichner oder Makronamen
  • 6 signifikante Anfangszeichen in einem externen Bezeichner
  • 511 externe Bezeichner in einer Übersetzungseinheit
  • 127 Bezeichner mit Blockgültigkeitsbereich, deklariert in einem Block
  • 1024 Makrobezeichner gleichzeitig definiert in einer Präprozessor-Übersetzungseinheit
(bis C99)
  • 63 signifikante Anfangszeichen in einem internen Bezeichner oder Makronamen
  • 31 signifikante Anfangszeichen in einem externen Bezeichner
  • 4095 externe Bezeichner in einer Übersetzungseinheit
  • 511 Bezeichner mit Blockgültigkeitsbereich, deklariert in einem Block
  • 4095 Makrobezeichner gleichzeitig definiert in einer Präprozessor-Übersetzungseinheit
(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