it-swarm.com.de

Warum wird in C ++ so oft __ (doppelter Unterstrich) verwendet?

Ich habe mir Open-Source-C++ - Code angesehen und festgestellt, dass im Code eine Menge doppelter Noten vorwiegend am Anfang von Variablennamen verwendet wurden.

return __CYGWIN__;

Ich frage mich nur, ob es einen Grund dafür gibt, oder ob es nur einige Leute sind, die Stile codieren? Ich würde denken, dass ich es schwer zu lesen mache.

85
Nathan W

From Programmierung in C++, Regeln und Empfehlungen :

Die Verwendung von zwei Unterstrichen ("__") in Bezeichnern ist gemäß dem ANSI-C-Standard für die interne Verwendung des Compilers reserviert.

Unterstriche ("_") werden häufig in Namen von Bibliotheksfunktionen verwendet (z. B. "_main" und "_exit"). Um Kollisionen zu vermeiden, beginnen Sie einen Bezeichner nicht mit einem Unterstrich.

119
maccullt

Wenn sie nicht das Gefühl haben, "Teil der Implementierung" zu sein, d. H. Der Standardbibliotheken, sollten sie dies nicht tun.

Die Regeln sind ziemlich spezifisch und etwas detaillierter, als einige andere vorgeschlagen haben.

Alle Bezeichner, die einen doppelten Unterstrich enthalten oder mit einem Unterstrich gefolgt von einem Großbuchstaben beginnen, sind für die Verwendung der Implementierung in allen Bereichen reserviert, d. H. Sie können für Makros verwendet werden.

Außerdem sind alle anderen Kennungen, die mit einem Unterstrich beginnen (d. H. Nicht gefolgt von einem anderen Unterstrich oder einem Großbuchstaben), für die Implementierung im globalen Bereich reserviert. Dies bedeutet, dass Sie diese Bezeichner in Ihren eigenen Namespaces oder in Klassendefinitionen verwenden können.

Aus diesem Grund verwendet Microsoft für viele ihrer Kernfunktionen der Laufzeitbibliothek, die nicht Teil des C++ - Standards sind, Funktionsnamen mit einem führenden Unterstrich in Kleinbuchstaben. Es wird garantiert, dass diese Funktionsnamen weder mit Standard-C++ - Funktionen noch mit Benutzercodefunktionen kollidieren.

48
CB Bailey

Nach dem C++ Standard sind Bezeichner, die mit einem Unterstrich beginnen, für Bibliotheken reserviert. Bezeichner, die mit zwei Unterstrichen beginnen, sind Compiler-Anbietern vorbehalten.

34
James Curran

Die vorstehenden Ausführungen sind zutreffend. __Symbol__ ist im Allgemeinen ein magisches Token, das von Ihrem hilfreichen Compiler (oder Präprozessor) -Verkäufer bereitgestellt wird. Vielleicht sind die am weitesten verbreiteten von diesen __FILE__ und __LINE__, die vom C-Präprozessor erweitert werden, um den aktuellen Dateinamen und die Zeilennummer anzuzeigen. Dies ist praktisch, wenn Sie eine Art Fehler bei der Programmassertion protokollieren möchten, einschließlich der textuellen Position des Fehlers.

10
bog

Es ist etwas, was Sie nicht in 'normalem' Code tun sollen. Dies stellt sicher, dass Compiler und Systembibliotheken Symbole definieren können, die nicht mit Ihren kollidieren.

8
Menkboy

Zusätzlich zu Bibliotheken, auf die viele andere Personen geantwortet haben, benennen einige Personen auch Makros oder #Define-Werte für die Verwendung mit dem Präprozessor. Dies würde die Arbeit erleichtern und möglicherweise die Behebung von Fehlern in älteren Compilern ermöglichen.

Wie bereits erwähnt, hilft es, Namenskollisionen zu vermeiden und zwischen Bibliotheksvariablen und Ihren eigenen zu unterscheiden.

2
Sqeaky

Die am häufigsten gewählte Antwort lautet Programmierung in C++: Regeln und Empfehlungen :

"Die Verwendung von zwei Unterstrichen (" __ ") in Bezeichnern ist gemäß dem ANSI-C-Standard für die interne Verwendung des Compilers reserviert."

Die Behauptung dieser Seite scheint jedoch unbegründet zu sein

Ich habe einige C++ - und C-Standards durchsucht und konnte keine Erwähnung von Unterstrichen finden, die auf die interne Verwendung des Compilers beschränkt waren.

C++ (aktueller Arbeitsentwurf, Zugriff auf 2019-5-26) Zustände in Lex.name:

  • Jeder Bezeichner, der einen doppelten Unterstrich __ enthält oder mit einem Unterstrich gefolgt von einem Großbuchstaben beginnt, ist für die Implementierung für jegliche Verwendung reserviert.
  • Jeder Bezeichner, der mit einem Unterstrich beginnt, ist für die Implementierung zur Verwendung als Name im globalen Namespace reserviert.

TL; DR: Doppelte Unterstriche sind der Implementierung vorbehalten

Obwohl diese Frage spezifisch für C++ ist, habe ich relevante Abschnitte aus den C-Standards 99 und 17 zitiert:

C99 Abschnitt 7.1.3

  • Alle Bezeichner, die mit einem Unterstrich und entweder einem Großbuchstaben oder einem anderen Unterstrich beginnen, sind immer für die 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.

C17 sagt dasselbe wie C99.

2