Ich habe einen Open-Source-C ++ - Code durchgesehen und festgestellt, dass im Code viele doppelte Unter-Scores verwendet wurden, hauptsächlich am Anfang von Variablennamen.
return __CYGWIN__;
Ich frage mich nur, ob es einen Grund dafür gibt, oder sind es nur einige Leute, die Stile codieren? Ich würde denken, dass ich es schwer zu lesen mache.
c++
double-underscore
Nathan W.
quelle
quelle
#define FOO 1
, müssen es jedoch nicht.#define __FOO__ 1
Daher kann die Implementierung den Namen__FOO__
für ihre eigenen Makros, Variablen, Funktionen usw. verwenden.Antworten:
Aus der Programmierung in C ++, Regeln und Empfehlungen :
quelle
namespace
eingeführt wurde._main
.Wenn sie sich nicht als "Teil der Implementierung" fühlen, dh als 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, dh sie können für Makros verwendet werden.
Darüber hinaus sind alle anderen Bezeichner, die mit einem Unterstrich beginnen (dh 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 Funktionsnamen mit einem führenden Unterstrich und alles in Kleinbuchstaben für viele der wichtigsten Funktionen der Laufzeitbibliothek, die nicht Teil des C ++ - Standards sind. Es wird garantiert, dass diese Funktionsnamen weder mit Standard-C ++ - Funktionen noch mit Benutzercodefunktionen in Konflikt geraten.
quelle
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.
quelle
Die vorstehenden Kommentare sind korrekt.
__Symbol__
ist im Allgemeinen ein magisches Token, das von Ihrem hilfreichen Compiler- (oder Präprozessor-) Anbieter bereitgestellt wird. Die vielleicht am häufigsten verwendeten sind__FILE__
und__LINE__
, die vom C-Präprozessor erweitert werden, um den aktuellen Dateinamen und die Zeilennummer anzugeben. Dies ist praktisch, wenn Sie einen Fehler bei der Programmzusicherung protokollieren möchten, einschließlich der Textposition des Fehlers.quelle
Es ist etwas, was Sie im "normalen" Code nicht tun sollen. Dies stellt sicher, dass Compiler und Systembibliotheken Symbole definieren können, die nicht mit Ihren kollidieren.
quelle
Doppelte Unterstriche sind der Implementierung vorbehalten
Die am häufigsten gewählte Antwort zitiert Programmieren in C ++: Regeln und Empfehlungen :
Doch nach ein paar C ++ und C - Normen gelesen hatte, war ich nicht in der Lage jede Erwähnung von Unterstrichen zu finden beschränkt ist nur der Compiler den internen Gebrauch. Die Standards sind allgemeiner und behalten doppelte Unterstriche für die Implementierung vor .
C ++
In C ++ (aktueller Arbeitsentwurf, abgerufen am 26.05.2019) heißt es in
lex.name
:C.
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
C17 sagt dasselbe wie C99.
Was ist die Implementierung ?
Bei C / C ++ bezieht sich die Implementierung lose auf die festgelegten Ressourcen, die zum Erstellen einer ausführbaren Datei aus Benutzerquelldateien erforderlich sind. Das beinhaltet:
Beispielimplementierungen
Es gibt eine Reihe verschiedener C ++ - Implementierungen, die auf Wikipedia erwähnt werden . (kein Ankerlink, Strg + f "Implementierung")
Hier ist ein Beispiel für die C / C ++ - Implementierung von Digital Mars, bei der einige Schlüsselwörter für eine ihrer Funktionen reserviert werden.
quelle
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 Umgehung von Fehlern in älteren Compilern ermöglichen.
Wie bereits erwähnt, hilft es dabei, Namenskollisionen zu verhindern und zwischen Bibliotheksvariablen und Ihren eigenen zu unterscheiden.
quelle