Was ist der übliche Weg, um Ihre Include-Wachen einzurichten? Ich schreibe sie normalerweise als (zum Beispiel.h):
%Vor% Bedeutet die Unterstreichung von Konvention? Ich habe widersprüchliche Informationen gesehen, als ich das gegoogelt habe. Muss der _EXAMPLE_H_
sogar mit dem Namen des Headers übereinstimmen?
Ja. Es ist wichtig.
Bezeichner mit einem führenden Unterstrich gefolgt von einem Großbuchstaben sind für die Implementierung reserviert. Also, was Sie haben, würde undefined Verhalten verursachen.
Das Folgende ist die Spezifikation des C-Standards für die Benennung der Bezeichner ( Entwurf C11 ):
7.1.3 Reservierte Identifikatoren
Jede Kopfzeile deklariert oder definiert alle in ihr aufgeführten IDs zugeordnete Unterklausel und deklariert oder definiert optional Bezeichner aufgeführt in seiner zugehörigen zukünftigen Bibliothek Richtungen Unterabschnitt und Identifikatoren, die immer entweder für eine Verwendung oder zur Verwendung als reserviert sind Dateibereichsbezeichner.
- Alle Bezeichner, die mit einem Unterstrich und entweder einem beginnen Großbuchstaben oder ein anderer Unterstrich sind immer für alle reserviert verwenden.
- Alle Bezeichner, die mit einem Unterstrich beginnen, sind immer reserviert zur Verwendung als Bezeichner mit Dateibereich sowohl im gewöhnlichen als auch im Tag Namensräume.
- Jeder Makroname in einem der folgenden Unterklauseln (einschließlich der zukünftige Bibliothek Richtungen) ist reserviert für die Verwendung wie angegeben, wenn einer der die zugehörigen Header sind enthalten; sofern nicht ausdrücklich anders angegeben (siehe 7.1.4). - Alle Bezeichner mit externer Verknüpfung in einem der folgende Unterklauseln (einschließlich der zukünftigen Bibliotheksanweisungen) und errno sind immer für die Verwendung als Kennungen mit externen reserviert linkage.184) - Jede Kennung mit Dateibereich, die in einem der folgende Unterklauseln (einschließlich der zukünftigen Bibliotheksanweisungen) ist reserviert für die Verwendung als Makroname und als Bezeichner mit Dateibereich im selben Namensraum, wenn einer der zugehörigen Header enthalten ist.
Keine anderen Kennungen sind reserviert. Wenn das Programm deklariert oder definiert eine Kennung in einem Kontext, in dem sie reserviert ist (nicht als erlaubt durch 7.1.4), oder definiert eine reservierte Kennung als Makroname, Das Verhalten ist nicht definiert.
Wenn das Programm (mit #undef) eine Makrodefinition von einem entfernt Bezeichner in der ersten oben aufgeführten Gruppe ist das Verhalten nicht definiert.
Ohne einen der obigen Punkte zu verletzen, kann der Name des include-Wächters alles sein und muss nicht der Name der Header-Datei sein. Aber die Konvention, die ich gesehen / benutzt habe, besteht normalerweise darin, denselben Namen wie den Namen der Header-Datei zu verwenden, so dass keine unnötige Verwirrung entsteht.
Es gibt keine absolute Anforderung, wie Wächter benannt werden. Es muss nicht mit dem Kopfzeilennamen übereinstimmen. Ich habe (und habe selbst) einige verwendet, die eine UUID verwenden, die im Wesentlichen aus einer zufällig erzeugten hexadezimalen Zeichenfolge besteht.
Technisch wie KingsIndian sagte, sind Kennungen, die mit Unterstrichen beginnen, reserviert:
Die Regeln, umschrieben von ANSI Sec. 4.1.2.1, sind:
%Vor%
Vielleicht entspannt der neue ISO C11 (?) Standard diese Regeln, aber das war schon eine Weile das Entscheidende.
Tags und Links c include-guards