Die Regeln (die sich in C ++ 11 nicht geändert haben):
- In jedem Bereich reserviert, auch zur Verwendung als Implementierungsmakros :
- Bezeichner, die mit einem Unterstrich beginnen, unmittelbar gefolgt von einem Großbuchstaben
- Bezeichner mit benachbarten Unterstrichen (oder "doppeltem Unterstrich")
- Reserviert im globalen Namespace:
- Bezeichner, die mit einem Unterstrich beginnen
- Außerdem ist alles im
std
Namespace reserviert. (Sie können jedoch Vorlagenspezialisierungen hinzufügen.)
Aus dem C ++ Standard 2003:
17.4.3.1.2 Globale Namen [lib.global.names]
Bestimmte Sätze von Namen und Funktionssignaturen sind immer der Implementierung vorbehalten:
- Jeder Name, der einen doppelten Unterstrich (
__
) enthält oder mit einem Unterstrich gefolgt von einem Großbuchstaben (2.11) beginnt, ist der Implementierung für jede Verwendung vorbehalten.
- Jeder Name, der mit einem Unterstrich beginnt, ist der Implementierung zur Verwendung als Name im globalen Namespace vorbehalten. 165
165) Solche Namen sind auch im Namespace ::std
(17.4.3.1) reserviert .
Da C ++ auf dem C-Standard (1.1 / 2, C ++ 03) basiert und C99 eine normative Referenz (1.2 / 1, C ++ 03) ist, gelten diese auch ab dem C-Standard von 1999:
7.1.3 Reservierte Kennungen
Jeder Header deklariert oder definiert alle in seinem zugeordneten Unterabschnitt aufgelisteten Bezeichner und deklariert oder definiert optional Bezeichner, die in seinem zugeordneten zukünftigen Bibliotheksanweisungsunterabschnitt und Bezeichnern aufgeführt sind, die immer entweder für eine Verwendung oder zur Verwendung als Dateibereichsbezeichner reserviert sind.
- Alle Bezeichner, die mit einem Unterstrich und entweder einem Großbuchstaben oder einem anderen Unterstrich beginnen, sind immer für jede Verwendung reserviert.
- Alle Bezeichner, die mit einem Unterstrich beginnen, sind immer für die Verwendung als Bezeichner mit Dateibereich sowohl im normalen als auch im Tag-Namensraum reserviert.
- Jeder Makroname in einem der folgenden Unterabschnitte (einschließlich der zukünftigen Bibliotheksanweisungen) ist für die Verwendung wie angegeben reserviert, wenn einer der zugehörigen Header enthalten ist. sofern nicht ausdrücklich anders angegeben (siehe 7.1.4).
- Alle Bezeichner mit externer Verknüpfung in einem der folgenden Unterabschnitte (einschließlich der zukünftigen Bibliotheksanweisungen) sind immer für die Verwendung als Bezeichner mit externer Verknüpfung reserviert. 154
- Jeder Bezeichner mit Dateibereich, der in einem der folgenden Unterabschnitte aufgeführt ist (einschließlich der zukünftigen Bibliotheksanweisungen), ist für die Verwendung als Makroname und als Bezeichner mit Dateibereich im selben Namensraum reserviert, wenn einer der zugehörigen Header enthalten ist.
Es sind keine anderen Bezeichner reserviert. Wenn das Programm einen Bezeichner in einem Kontext deklariert oder definiert, in dem es reserviert ist (anders als in 7.1.4 zulässig), oder einen reservierten Bezeichner als Makronamen definiert, ist das Verhalten undefiniert.
Wenn das Programm #undef
eine Makrodefinition eines Bezeichners in der ersten oben aufgeführten Gruppe entfernt (mit ), ist das Verhalten undefiniert.
154) Die Liste der reservierten Bezeichner mit externer Bindung enthält errno
, math_errhandling
, setjmp
, und va_end
.
Möglicherweise gelten andere Einschränkungen. Zum Beispiel reserviert der POSIX-Standard viele Bezeichner, die wahrscheinlich im normalen Code angezeigt werden:
- Namen, die mit einem Großbuchstaben beginnen,
E
folgten einer Ziffer oder einem Großbuchstaben:
- kann für zusätzliche Fehlercode-Namen verwendet werden.
- Namen, die entweder mit
is
oder to
gefolgt von einem Kleinbuchstaben beginnen
- kann für zusätzliche Zeichentest- und Konvertierungsfunktionen verwendet werden.
- Namen, die mit
LC_
einem Großbuchstaben
beginnen
- kann für zusätzliche Makros verwendet werden, die Gebietsschemaattribute angeben.
- Namen aller vorhandenen mathematischen Funktionen, denen ein Suffix hinzugefügt wurde
f
oder l
die reserviert sind
- für entsprechende Funktionen, die mit float- bzw. langen Doppelargumenten arbeiten.
- Namen, die mit
SIG
einem Großbuchstaben beginnen, sind reserviert
- für zusätzliche Signalnamen.
- Namen, die mit
SIG_
einem Großbuchstaben beginnen, sind reserviert
- für zusätzliche Signalaktionen.
- Namen, die mit
str
, mem
oder wcs
gefolgt von einem Kleinbuchstaben beginnen, sind reserviert
- für zusätzliche String- und Array-Funktionen.
- Namen, die mit
PRI
oder SCN
gefolgt von Kleinbuchstaben beginnen oder X
reserviert sind
- für zusätzliche Formatbezeichner-Makros
- Namen, die mit enden,
_t
sind reserviert
- für zusätzliche Typnamen.
Obwohl die Verwendung dieser Namen für Ihre eigenen Zwecke im Moment möglicherweise kein Problem darstellt, besteht die Möglichkeit eines Konflikts mit zukünftigen Versionen dieses Standards.
Persönlich beginne ich Bezeichner einfach nicht mit Unterstrichen. Neu in meiner Regel: Verwenden Sie nirgendwo doppelte Unterstriche, was einfach ist, da ich selten Unterstriche verwende.
Nachdem ich diesen Artikel recherchiert habe, beende ich meine Bezeichner nicht mehr mit, _t
da dies dem POSIX-Standard vorbehalten ist.
Die Regel, dass ein Bezeichner mit endet _t
, hat mich sehr überrascht. Ich denke, das ist ein POSIX-Standard (noch nicht sicher), der nach Klarstellung und offiziellem Kapitel und Vers sucht. Dies ist aus dem GNU libtool-Handbuch , in dem reservierte Namen aufgeführt sind.
CesarB stellte den folgenden Link zu den reservierten POSIX 2004- Symbolen und Notizen bereit , "dass dort viele andere reservierte Präfixe und Suffixe ... zu finden sind". Hier werden die
reservierten POSIX 2008- Symbole definiert. Die Einschränkungen sind etwas differenzierter als die oben genannten.