C++ #ifndef für include-Dateien, warum ist all caps verwendet, für die header-Datei?
Frage ich mich, warum den Namen nach der #ifndef
Richtlinie ist immer alle Kappen und scheinen nicht zu passen der name der header-Datei? Was sind die Regeln rund um diese? Ich habe auf der Suche um die webs aber ich habe nicht gefunden eine Erklärung für diese. Wenn mein header-Datei aufgerufen wird myheader.h wäre es dann ok zu verwenden:
#ifndef MYHEADER
Wenn ja, warum? Was sind die Regeln?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese sind Präprozessor-Symbole und haben keine solchen Regeln. (solange Sie mit den
#defines
im Header)Jedoch, die Konvention ist die Verwendung von Großbuchstaben für Präprozessor-Symbole.
Gibt es keine "Regel", es gibt nur Konventionen. Die erste und am häufigsten verwendete Konvention ist, dass alle precompiler Makros sind alle Großbuchstaben, also header Wachen sollte auch Großbuchstaben.
Als auch für den makro-Namen, was ich benutze (und was die meisten der code, den ich gesehen habe) verwendet, ist nur der name im header (wie gesagt, gedreht in Großbuchstaben) einschließlich der Verlängerung, ersetzt den Punkt durch einen Unterstrich, gefolgt von
_INCLUDED
.Beachten Sie, dass viele stellen diese Bezeichner mit einem Unterstrich oder einem doppelten Unterstrich, aber es ist keine gute Praxis, da der standard gibt an, dass Bezeichner Anfang (oder mit) doppelte Unterstriche und diejenigen, beginnend mit einem einzelnen Unterstrich gefolgt von einem Großbuchstaben sind reserviert für den compiler/library-spezifische Sachen (z.B. __declspec in VC++ oder Makros in der standard-Header) an alle Bereiche; alle anderen Bezeichner beginnen mit einem einzelnen Unterstrich beginnen, sind reserviert auf globaler Ebene. Also diese Bezeichner nicht verwendet werden sollte, um Kollisionen zu vermeiden.
Mehr info auf dieses Zeug hier.
Ist es nicht erforderlich, alle in Großbuchstaben geschrieben werden. Es ist nur die Allgemeine Konvention. Normalerweise verwende ich etwas wie
#ifndef MYHEADER_H_INCLUDED
.Google für "include-guard" zu finden, was die Sache eigentlich geht.
Über die all-caps: Es ist ein übereinkommen für Makros werden in allen upper-case. Der Grund dafür ist, dass die Makros verarbeitet werden durch den Präprozessor, einen arkanen text-Bearbeitungs-tool, das nichts weiß von C++, und ist am besten verschlossen gemeinsame Kennzeichen, damit es nicht tramples alle über Sie, erstellen ein großes Durcheinander.
Die Idee ist, um sicherzustellen, dass Ihre header-Datei nur einmal gelesen während bauen. Das idiom, um dies zu erreichen, ist die Struktur:
Dies bedeutet, dass Sie sollten wählen Sie einen Namen, Sie sind ziemlich sicher, einzigartig sein und einen gültigen Bezeichner #ifndef. Sie sollten auch sicherstellen, dass die Bezeichner nicht in tatsächliche code oder verwirrt mit einer variable oder so etwas. Mit einem Großbuchstaben tag markiert das idiom deutlich. Außer, dass, es ist lediglich von Konventionen nicht Sprache, diktieren, dass die Wahl. Die Visual Studio-Assistenten generiert eine GUID wie Bezeichner für. Sone Compiler support #pragma once, die den gleichen Effekt haben.
Können Sie einen beliebigen Namen Sie wollen, aber Sie wollen es eindeutig so, dass der Wert nicht definiert außerhalb Ihrer Kopf-durch Zufall, also mit header-Namen mit Großbuchstaben ist eine schöne Konvention, um sicherzustellen, dass.
Es ist völlig subjektiv und es gibt keine durchsetzbare Regeln andere als die normalerweise in Verbindung mit dem Zeichensatz zur Benennung von Präprozessor-Makros. Es ist üblich für Makros definiert werden, die im oberen Fall. Dieser neigt dazu, Ihnen helfen, zeichnen sich in source code. Eine Konvention, die ich neigen dazu, zu bleiben, um die strengen aktivierte version des Dateinamen mit der Periode durch einen Unterstrich ersetzt und führende und nachfolgende Unterstriche. So, nach einer Datei namens
DataTableNameMangler.hpp
den include-guard Aussehen würde:Gibt es keinen guten Grund für diese, obwohl ich empfehle, Konsistenz, dass der name mit dem Dateinamen genau. Ich normalerweise benutze ein wenig die Klasse creator Skript, um die Erstellung meiner ersten Klassen. Das folgende Bash-snippet gibt eine Idee:
Also:
Dies ist natürlich nur ein sehr einfaches Beispiel. Wichtig ist, denken Sie daran, dass der Kommentar vor der Wache-name in die Letzte Zeile.
#endif
übernimmt keine Parameter, so wird das makro übergeben werden, der auf der C++ - compiler wird sich beschweren, wenn es nicht kommentiert.