In C ++ ist es üblich, Mitgliedsvariablen mit einem Präfix zu benennen, um die Tatsache anzuzeigen, dass es sich um Mitgliedsvariablen handelt und nicht um lokale Variablen oder Parameter. Wenn Sie aus einem MFC-Hintergrund stammen, werden Sie wahrscheinlich verwenden m_foo
. Ich habe auch myFoo
gelegentlich gesehen .
C # (oder möglicherweise nur .NET) scheint zu empfehlen, nur einen Unterstrich zu verwenden, wie in _foo
. Ist dies nach dem C ++ - Standard zulässig?
c++
naming-conventions
standards
c++-faq
Roger Lipscombe
quelle
quelle
Antworten:
Die Regeln (die sich in C ++ 11 nicht geändert haben):
std
Namespace reserviert. (Sie können jedoch Vorlagenspezialisierungen hinzufügen.)Aus dem C ++ Standard 2003:
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:
Möglicherweise gelten andere Einschränkungen. Zum Beispiel reserviert der POSIX-Standard viele Bezeichner, die wahrscheinlich im normalen Code angezeigt werden:
E
folgten einer Ziffer oder einem Großbuchstaben:is
oderto
gefolgt von einem Kleinbuchstaben beginnenLC_
einem Großbuchstaben beginnenf
oderl
die reserviert sindSIG
einem Großbuchstaben beginnen, sind reserviertSIG_
einem Großbuchstaben beginnen, sind reserviertstr
,mem
oderwcs
gefolgt von einem Kleinbuchstaben beginnen, sind reserviertPRI
oderSCN
gefolgt von Kleinbuchstaben beginnen oderX
reserviert sind_t
sind reserviertObwohl 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.
quelle
_Bool
und_Imaginary
existiert in C ++ nicht? Die C ++ - Sprache wird explizit definiert, nicht in Form von "Änderungen" an C, da sonst der Standard viel kürzer sein könnte!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 und eine einfache Regel wollte, habe ich eine persönliche Regel entworfen , die sowohl einfach als auch korrekt ist:
Wenn Sie ein Symbol benennen, vermeiden Sie Kollisionen mit Compiler- / Betriebssystem- / Standardbibliotheken, wenn Sie:
Wenn Sie Ihren Code in einen eindeutigen Namespace einfügen, können Sie natürlich auch Kollisionen vermeiden (schützt jedoch nicht vor bösen Makros).
Einige Beispiele
(Ich verwende Makros, weil sie die C / C ++ - Symbole stärker durch Code verschmutzen, aber es kann alles sein, vom Variablennamen bis zum Klassennamen.)
Auszüge aus dem C ++ 0x-Entwurf
Aus der Datei n3242.pdf (ich erwarte, dass der endgültige Standardtext ähnlich ist):
Aber auch:
Diese letzte Klausel ist verwirrend, es sei denn, Sie denken, dass ein Name, der mit einem Unterstrich beginnt und auf den ein Kleinbuchstabe folgt, in Ordnung wäre, wenn er nicht im globalen Namespace definiert wäre ...
quelle
__WRONG_AGAIN__
Enthält zwei aufeinanderfolgende Unterstriche (zwei am Anfang und zwei am Ende), daher ist dies gemäß dem Standard falsch.WRONG__WRONG
enthält zwei aufeinanderfolgende Unterstriche (zwei in der Mitte), so dass dies gemäß dem Standard falsch ist__attribute__
. B. für GCC) möglicherweise mit einem Schlüsselwort kollidiert .1234567L
oder4.0f
; IIRC bezieht sich dies auf ohttp: //en.cppreference.com/w/cpp/language/user_literalWhy is there any problem of having two consecutive underscores in the middle according to the standard?
Weil der Standard sagt, dass diese reserviert sind. Dies ist kein Ratschlag für guten oder schlechten Stil. Es ist eine Entscheidung aus dem Standard. Warum haben sie das entschieden? Ich denke, die ersten Compiler haben solche Konventionen bereits vor der Standardisierung informell verwendet.Von MSDN :
Dies bedeutet, dass Sie einen einzelnen Unterstrich als Präfix für eine Mitgliedsvariable verwenden können, sofern ein Kleinbuchstabe folgt.
Dies stammt anscheinend aus Abschnitt 17.4.3.1.2 des C ++ - Standards, aber ich kann online keine Originalquelle für den vollständigen Standard finden.
Siehe auch diese Frage .
quelle
Was den anderen Teil der Frage betrifft, ist es üblich, den Unterstrich am Ende des Variablennamens zu setzen, um nicht mit internen Elementen in Konflikt zu geraten.
Ich mache das sogar innerhalb von Klassen und Namespaces, weil ich mich dann nur noch an eine Regel erinnern muss (im Vergleich zu "am Ende des Namens im globalen Bereich und am Anfang des Namens überall sonst").
quelle
Ja, Unterstriche können überall in einem Bezeichner verwendet werden. Ich glaube, die Regeln sind: az, AZ, _ im ersten Zeichen und diese + 0-9 für die folgenden Zeichen.
Unterstrichpräfixe sind im C-Code üblich - ein einzelner Unterstrich bedeutet "privat", und doppelte Unterstriche sind normalerweise für die Verwendung durch den Compiler reserviert.
quelle