Frage

Wie werden C ++ Wächter typischerweise genannt? Ich neige dazu, das viel zu sehen:

#ifndef FOO_H
#define FOO_H

// ...

#endif

Ich denke jedoch nicht, dass das sehr intuitiv ist. Ohne den Dateinamen zu sehen, ist es schwierig zu sagen was FOO_H Gibt es für und wie sein Name bezieht.

Was wird als Best Practice angesehen?

War es hilfreich?

Lösung

Aus meiner eigenen Erfahrung besteht die Konvention darin, die Einschlusswächter nach der Header -Datei zu benennen, die sie enthält, mit der Ausnahme, dass der Name in CAPS ist und der Zeitraum durch einen Unterstrich ersetzt wird.

So test.h wird TEST_H.

Beispiele für reale Lebense umfassen QT Creator, der dieser Konvention bei automatischer Generierung von Klassenheader-Dateien folgt.

Andere Tipps

Ich persönlich folge Boosts Empfehlung. Es ist vielleicht eine der größten Sammlung von C ++ - Bibliotheken von guter Qualität und sie haben kein Problem.

Es geht wie:

<project>_<path_part1>_..._<path_partN>_<file>_<extension>_INCLUDED

// include/pet/project/file.hpp
#ifndef PET_PROJECT_FILE_HPP_INCLUDED

welches ist:

  • legal (beachten Sie, dass der Beginn bis nach _[A-Z] oder enthalten __ ist nicht)
  • Einfach zu erzeugen
  • In einem Projekt garantiert eindeutig (als Wachmann eingeschlossen) (sonst haben Sie zwei Dateien an derselben Stelle)
  • garantiert für nichts anderes verwendet werden (wenn Sie ein weiteres Makro mit beenden INCLUDED Sie verderben sich für einen Kampf)

Ich habe über Guid gelesen, aber diese sehen komisch aus.

Und natürlich würde ich anstatt alle Compiler implementieren #pragma once (oder besser, #pragma multiple und "einst" das Standardverhalten sein ...)

Direkt von Google's Style Guide:

Alle Header -Dateien sollten #Define Guards haben, um mehrere Einschlüsse zu verhindern. Das Format des Symbolnamens sollte seinu003CPROJECT> _u003CPATH> _u003CFILE> _H_. Um die Einzigartigkeit zu gewährleisten, sollten sie auf dem vollständigen Pfad im Quellbaum eines Projekts beruhen. Beispielsweise sollte die Datei foo/src/bar/baz.h in Project Foo die folgende Wache haben:

 #ifndef FOO_BAR_BAZ_H_
 #define FOO_BAR_BAZ_H_
 ...
 #endif  // FOO_BAR_BAZ_H_

Ich benutze diesen Stil in meinen eigenen Projekten.

Schauen Sie sich den Code an, der #Ihren Header enthält.

Wenn es so etwas wie:

#include "mylib/myheader.h"

mylib/myheader.h ist bereits ein eindeutiger Name. Einfach nutzen und ersetzen / und. mit _

#define MYLIB_MYHEADER_H

Wenn Sie zwei Header auf Ihrem Pfad mit demselben Namen relativ zum Include -Pfad haben, haben Sie bereits eine Kollision auf dieser Ebene.

Ersetzen FOO_H mit FOO_H_INCLUDED Und es ist klarer.

Wie andere bereits erwähnt, besteht eine sehr verbreitete Konvent

Dies kann jedoch zu Kollisionen mit einfachen und/oder gebräuchlichen Namen führen. Aus diesem Grund haben autogenerierte Header wie das stdafx.h in nicht leeren visuellen C C ++-Projekten eine zufällige Zeichenfolge an, z. B.:

#ifndef FOO_H__NsknZfLkajnTFBpHIhKS
#define FOO_H__NsknZfLkajnTFBpHIhKS
#endif

http://www.random.org/strings/ ist dafür ein nützlicher Zufallsgenerator.

Wenn die Datei Teil eines Submoduls ist oder deren Inhalt in einem bestimmten Namespace liegt, neige ich dazu, dies auch zur Wache hinzuzufügen:

#ifndef SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS
#define SOMECOMPONENT_FOO_H__NsknZfLkajnTFBpHIhKS

namespace somecomponent
{
  ...
}

#endif

Normalerweise benutze ich so etwas wie FOO_H_INCLUDED_. Ein paar (Microsoft-) Header haben eine String -Darstellung eines GUID, aber ich habe noch nie etwas so aufwändiges gebraucht.

Normalerweise tun die Leute dies mit Dateinamen, so dass der Code jeder Datei nur einmal zusammengestellt und hinzugefügt wird. Sie könnten foo_h was Sie wollen, aber fast alles, was ich jemals codiert oder gesehen habe, hat den Dateinamen verwendet. Stellen Sie einfach sicher, dass es einzigartig ist, weil Sie nicht möchten, dass Ihr Foo_h mit dem Foo_H eines anderen in Konflikt steht.

Normalerweise schaue ich zu wie viel Zeit und füge das einfach an das Ende hinzu, dh dh, dh FOO_H_248, Es ist eine zusätzliche Vorsichtsmaßnahme, und Sie müssen sich sowieso nie daran erinnern, also müssen Sie sich keine Sorgen darüber machen, dass es kryptisch ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top