Könnte der Compiler Variablen / Mitglieder mit einem Unterstrich-Puzzle starten?

12

Seit der High School wurde mir beigebracht, wie man solche Variablen definiert:

int _a;

oder

int __a;

sollte als schlechte Praxis angesehen werden, da dies eventuell Compiler rätseln würde, die Variablen verwenden, die mit einem Unterstrich beginnen, um temporäre Variablen zu benennen.

Soweit ich weiß, ist dies der Grund, warum manche Leute den Unterstrich am Ende des Namens gerne verschieben, wie zum Beispiel:

int a_;

Ich sehe jedoch überall viel Code, der Unterstrich-Startvariablen verwendet. Und dieser Code lässt sich sowohl mit Visual Studio 2010 als auch mit g ++ 4.x recht gut erstellen.

Ich frage mich also: Ist das heutzutage kein Thema? Sind moderne Compiler klüger in Bezug auf Namenskonventionen?

Emiliano
quelle
Keine wirkliche Antwort, aber es ist wahrscheinlich, dass die C ++ - Compiler von Microsoft diesbezüglich besonders nachsichtig sind, da es der interne Stil von Microsoft ist, Unterstriche vor privaten Mitgliedsvariablen zu verwenden (zumindest in C #). Ich weiß, dass g ++ immer noch Probleme mit führenden Unterstrichen haben kann.
KChaloux
6
Die Antworten auf diese Frage sind möglicherweise hilfreich.
Blrfl
1
@KChaloux Wenn Sie der Meinung sind, dass das seit mehr als 20 Jahren bestehende C ++ - Compilerteam von Microsoft die Regeln für akzeptable Bezeichnernamen basierend auf den Gewohnheiten einiger Leute im C # -Team festgelegt hat, wissen Sie nicht, wie Microsoft funktioniert :-). Im Ernst, es ist 21 Jahre her, dass sie ihren ersten C ++ - Compiler veröffentlicht haben, und diese Regeln reichen so weit zurück oder weiter in die ursprüngliche C-Compiler-Codebasis.
Kate Gregory
@ Kate Ich habe nur darauf hingewiesen, dass ich sicher wusste, dass sie es in C # verwendet haben. Ich verwende nicht den C ++ - Compiler von Microsoft oder weiß furchtbar viel über die Umgebung dort. Daher habe ich aus meiner Erfahrung mit C # auf die Verwendung dieses Namensstils in C ++ geschlossen. Nie machte keine Ansprüche , dass die C # Regel zuerst da war.
KChaloux

Antworten:

17

Sie verstehen anscheinend falsch, warum Präfix-Unterstriche eine schlechte Praxis sind. Um es kurz zu machen: Der C- und C ++ - Standard reserviert dieses Präfix für Implementierungsdetails, beispielsweise für die Standardbibliotheksimplementierung. (Beachten Sie, dass _ und __ nicht für dieselben Dinge reserviert sind, siehe Kommentare)

Selbst wenn sich die Namen im Gültigkeitsbereich befinden (Namespace, Klasse usw.), kann es einige globale Namen geben, insbesondere Makros, die dieses Präfix verwenden und Ihren Code möglicherweise unbemerkt beschädigen, wenn Sie sie auch verwenden.

Grundsätzlich ist es also die meiste Zeit sicher, dieses Präfix zu verwenden, ABER wenn Sie es nicht verwenden, haben Sie eine 100% ige Garantie, dass Ihre Benennung niemals mit den Implementierungsnamen in Konflikt steht.

Verwenden Sie daher im Zweifelsfall dieses Präfix nicht.

Klaim
quelle
3
Ihre Kommentare gelten für das Präfix von zwei Unterstrichen, aber nicht für einen einzelnen Unterstrich
Kate Gregory
1
@KateGregory: Namen mit einem führenden Unterstrich sind für die Implementierung für Namen im globalen Namespace reserviert. Ein führender Unterstrich, gefolgt von einem zweiten Unterstrich oder Großbuchstaben, ist für jede Verwendung reserviert (sie können von der Implementierung für Makros verwendet werden). Ein führender Unterstrich, gefolgt von einem Kleinbuchstaben, ist in lokalen Bereichen möglicherweise in Ordnung, wird jedoch am besten vermieden, um ein Stolpern und die Verwendung eines reservierten Namens zu vermeiden.
Bart van Ingen Schenau
4
@KateGregory: Als Mitglied _limitist dies kein Fehler, aber als globale Funktion. Ich denke, es ist besser, eine einfache Richtlinie zu haben, die besagt, dass "ausnahmslos keine führenden Unterstriche verwendet werden", als eine Richtlinie, die sie in bestimmten Kontexten und in anderen nicht zulässt. Aber wir können uns darauf einigen. Und um ganz klar zu sein, ich habe keine Probleme mit Unterstrichen an anderen Stellen als am Anfang.
Bart van Ingen Schenau
2
@BartvanIngenSchenau: Nur aus Interesse: Eine einfache Richtlinie wie "Verwenden Sie führende Unterstriche nur und nur für private Klassenmitglieder" sollte nicht zu technischen Problemen führen. Was ist Ihrer Meinung nach wahr?
Doc Brown
1
@KateGregory Zur Verdeutlichung stimme ich zu, dass die Regeln genauer sind als das, was ich in meiner Antwort sage. aber es spiegelt die mangelnde Präzision meines Gedächtnisses wider, wenn ich versuche, mich an die genauen Regeln zu erinnern. Da ich es vermeide, Ausnahmen kennen zu müssen (nicht die Funktion), bevorzuge ich allgemeine Regeln, die leicht zu befolgen sind, insbesondere für solche nicht so wichtigen Regeln. Das Lustige ist, dass ich mich mit Bewegungssemantik wohler fühle, als mich daran zu erinnern. Vielleicht macht das jetzt keinen Spaß, wenn ich darüber nachdenke ...
Klaim
16

Die Verwendung von zwei Unterstrichen ist definitiv schlecht - das ist für compilerspezifische Implementierungsdetails reserviert. Dies gilt nicht für die Verwendung eines Unterstrichs.

Einige Leute hassen Unterstriche. Ob Sie etwas anrufen m_indexoder highest_priceoder _a- sie verabscheuen es. Ich habe vor 25 Jahren mit jemandem zusammengearbeitet, der mir von einem bestimmten IBM-Drucker (einem sehr beliebten) erzählte, der mehr Zeilen auf die Seite passt, indem er das untere Pixel in jeder zweiten Zeile weglässt. Dies war in Ordnung für Memos oder für die Ausgabe großer Zahlenmengen und dergleichen, hatte jedoch den Effekt, dass der Code die Hälfte Ihrer Unterstriche unsichtbar machte. (Ja, wirklich!) Menschen aus dieser Generation haben im Allgemeinen den irrationalen Unterstrich-Hass, entweder durch die Interaktion mit diesem Drucker oder durch die Arbeit mit jemandem, der ihnen in den Sinn kommt, dass Unterstriche nicht verwendet werden dürfen.

Die meisten Menschen mit gemischtem Fall finden (eine Option , die wir haben in nicht sagen, Fortran) einen lesbaren Ansatz: mIndex, HighestPrice, asteht ziemlich gut zu den früheren unterstrichene Beispielen auf. Ich werde Ihnen zwei Regeln geben:

  • Starten Sie niemals etwas (Funktion, Variable, Makro, Typedef) mit zwei Unterstrichen
  • Wählen Sie eine konsistente Konvention (z. B. _limitfür Funktionsparameter, m_limitfür Mitgliedsvariablen, verwenden Sie niemals Unterstriche, Kamelbuchstaben, schreiben Sie jedes Wort groß, Ungarisch, etwas ) und halten Sie sich daran. Gehen Sie nicht manchmal mit Unterstrichen am Anfang, manchmal am Ende, manchmal ohne Verwendung und fünf verschiedenen Gehäusekonventionen herum. Seien Sie konsequent.

Der betreffende Drucker ist längst verschwunden. Wenn Sie jeweils einen Unterstrich verwenden möchten, können Sie dies gerne tun. Aber verstehen Sie, es gibt immer noch unterstreichende Hasser.

Kate Gregory
quelle
"Ob Sie etwas m_index oder höchster_Preis oder _a nennen - sie verabscheuen es" Nicht ohne Grund! Sie haben nicht erwähnt, dass die Standards Regeln enthalten, die sich speziell auf die Verwendung führender Unterstriche in Bezeichnern beziehen. Warum um Ärger bitten, wenn es so leicht zu vermeiden ist? stackoverflow.com/a/228797
Max Barraclough
keine Erwähnung gemacht? Lesen Sie den ersten Satz noch einmal.
Kate Gregory
"Dies gilt nicht für die Verwendung eines Unterstrichs" ist nicht die ganze Geschichte, siehe meinen Link, der besagt, dass das Führen mit doppelten Unterstrichen ein ziemlich definitives Nein-Nein ist, sondern dass "im globalen Namespace reserviert: Bezeichner, die mit einem beginnen unterstreichen". Warum mit dem Feuer spielen?
Max Barraclough
1
ok, du verpasst den Punkt. Der zweite Absatz befasst sich mit der Existenz von Menschen, die im Allgemeinen gegen den Unterstrich sind. Keine führenden Unterstriche. Alle Unterstriche. Ja, es stimmt, dass es zusätzlich zu der Regel über zwei Unterstriche auch eine Regel über führende Unterstriche gibt, gefolgt von einem Großbuchstaben, führenden Unterstrichen im globalen Geltungsbereich usw., aber abgesehen davon hassen einige Leute Unterstriche trotzdem. Und diese Leute nenne ich gerne falsch. Es gibt keinen auf Standards basierenden Grund, Einwände gegen nicht führende Unterstriche zu erheben. Aber die Leute tun es trotzdem.
Kate Gregory
Da sind wir uns nicht einig. Ja, es ist manchmal legal, eine Kennung mit einem einzelnen Unterstrich zu beginnen. Wie ich oben sagte, warum mit dem Feuer spielen? Ich beginne niemals einen Bezeichner mit einem Unterstrich. Ich betrachte es als Code-Geruch (wenn man sagen kann, dass man einen Geruch "sieht" :-P). Auf diese Weise mache ich mir keine Sorgen über die Einzelheiten der Regeln, die mir genau sagen, wann dies legal ist.
Max Barraclough