Die Regeln zur Vermeidung von Namenskollisionen sind sowohl im C++-Standard (siehe Stroustrup-Buch) als auch von C++-Gurus (Sutter usw.) erwähnt.
Persönliche Regel
Da ich mich nicht mit Fällen befassen wollte, sondern eine einfache Regel wollte, habe ich eine persönlich eine, die sowohl einfach als auch richtig ist:
Wenn Sie ein Symbol benennen, vermeiden Sie Kollisionen mit Compiler/OS/Standardbibliotheken, wenn Sie:
niemals ein Symbol mit einem Unterstrich beginnen niemals ein Symbol mit zwei aufeinanderfolgenden Unterstrichen benennen.
Natürlich hilft es auch, Ihren Code in einen eindeutigen Namensraum zu stellen, um Kollisionen zu vermeiden (schützt aber nicht vor bösen Makros).
Einige Beispiele
(Ich verwende Makros, weil sie den Code von C/C++-Symbolen am stärksten verschmutzen, aber es kann alles sein, vom Variablennamen bis zum Klassennamen)
#define _WRONG
#define __WRONG_AGAIN
#define RIGHT_
#define WRONG__WRONG
#define RIGHT_RIGHT
#define RIGHT_x_RIGHT
Auszüge aus dem C++0x-Entwurf
Von der n3242.pdf Datei (ich gehe davon aus, dass der endgültige Standardtext ähnlich sein wird):
17.6.3.3.2 Globale Namen [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.12) beginnt, ist der Implementierung zur beliebigen Verwendung vorbehalten.
- Jeder Name, der mit einem Unterstrich beginnt, ist für die Implementierung zur Verwendung als Name im globalen Namensraum reserviert.
Aber auch:
17.6.3.3.5 Benutzerdefinierte Literal-Suffixe [usrlit.suffix]
Wörtliche Suffix-Kennungen, die nicht mit einem Unterstrich beginnen, sind für eine zukünftige Standardisierung reserviert.
Diese letzte Klausel ist verwirrend, es sei denn, man bedenkt, dass ein Name, der mit einem Unterstrich beginnt und von einem Kleinbuchstaben gefolgt wird, in Ordnung wäre, wenn nicht die im globalen Namespace definiert sind...