1044 Stimmen

Was sind die Regeln für die Verwendung eines Unterstrichs in einem C++-Bezeichner?

In C++ ist es üblich, Mitgliedsvariablen mit einer Art Präfix zu benennen, um die Tatsache zu kennzeichnen, dass es sich um Mitgliedsvariablen und nicht um lokale Variablen oder Parameter handelt. Wenn Sie von einem MFC-Hintergrund kommen, werden Sie wahrscheinlich m_foo . Ich habe auch gesehen myFoo gelegentlich.

C# (oder vielleicht auch nur .NET) scheint zu empfehlen, nur einen Unterstrich zu verwenden, wie in _foo . Ist dies nach dem C++-Standard zulässig?

221voto

paercebal Punkte 78198

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...

49voto

Roger Lipscombe Punkte 84868

Von MSDN :

Die Verwendung von zwei aufeinanderfolgenden Unterstrichen ( __ ) am Anfang eines Bezeichners oder eines einzelnen führenden Unterstrichs, gefolgt von einem Großbuchstaben, ist für C++-Implementierungen in allen Bereichen reserviert. Sie sollten die Verwendung eines führenden Unterstrichs gefolgt von einem Kleinbuchstaben für Namen mit Dateigeltungsbereich wegen möglicher Konflikte mit aktuellen oder zukünftigen reservierten Bezeichnern vermeiden.

Das bedeutet, dass Sie einen einzelnen Unterstrich als Präfix für eine Mitgliedsvariable verwenden können, solange ihm ein Kleinbuchstabe folgt.

Dies ist offenbar aus Abschnitt 17.4.3.1.2 des C++-Standards entnommen, aber ich kann online keine Originalquelle für den vollständigen Standard finden.

Siehe auch diese Frage .

27voto

Max Lybbert Punkte 19181

Was den anderen Teil der Frage angeht, so ist es üblich, den Unterstrich am Ende der Ende des Variablennamens, damit er nicht mit internen Elementen kollidiert.

Ich mache das sogar innerhalb von Klassen und Namespaces, weil ich mir dann nur eine Regel merken muss (im Vergleich zu "am Ende des Namens im globalen Bereich und am Anfang des Namens überall sonst").

2voto

John Millikin Punkte 190278

Ja, Unterstriche können überall in einem Bezeichner verwendet werden. Ich glaube, die Regeln lauten: ein beliebiges a-z, A-Z, _ im ersten Zeichen und die +0-9 für die folgenden Zeichen.

Unterstrich-Präfixe sind in C-Code üblich - ein einzelner Unterstrich bedeutet "privat", und doppelte Unterstriche sind in der Regel für die Verwendung durch den Compiler reserviert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X