Wie lösen Sie erstellt, indem Sie eine Header-Datei mit dem gleichen Namen wie eine andere Header-Datei bereits indirekt als Ergebnis eines anderen enthalten enthalten?C++: mehrere Header-Dateien mit demselben Namen aus verschiedenen Namespaces enthalten
Zum Beispiel:
// src/blah/a.hpp
#ifndef A_HPP
#define A_HPP
namspace blah
{
class A
{
}
}
#endif
// src/blah/b.hpp
#ifndef B_HPP
#define B_HPP
#includes "a.hpp"
namspace blah
{
class B
{
}
}
#endif
// src/foo/a.hpp
#ifndef A_HPP
#define A_HPP
namspace foo
{
class A
{
}
}
#endif
// src/foo/c.hpp
#ifndef C_HPP
#define C_HPP
#includes "../b.hpp"
#includes "a.hpp" // won't be included due to multiple inclusion prevention
namspace foo
{
class C
{
}
}
#endif
Im letzten Header-Datei, a.hpp wird nicht wegen der mehrfachen Aufnahme Präprozessor Wachen eingeschlossen werden. Eigentlich sollte das aber in Ordnung sein, da sich die Klassen in verschiedenen Namespaces befinden. Mir ist klar, dass der einfache Weg darin besteht, einfach den Namen foo/a.hpp zu ändern oder ihm einfach einen falschen Namen im Multiple-Inclusion-Guard zu geben. Gibt es einen besseren Weg?
EDIT Ich verstehe, dass Sie dieses Problem, indem Sie einen beschreibenden Namen in den #define und #ifndef Richtlinien (zB FOO_A_HPP und BLAH_A_HPP) lösen kann, aber ich möchte wissen, ob, dass die empfohlene oder beste Weg, . Würden einige Leute empfehlen, einen anderen Dateinamen als eine bessere Lösung zu verwenden, oder spielt es keine Rolle? Würden Sie die Konvention empfehlen die Verwendung von:
<NAMESPACE>_<CLASS>_HPP
statt
<CLASS>_HPP
eine bessere Chance zu vermeiden, in der Regel diese Probleme zu geben?
Warum ist dies als C markiert? –
Ich habe den Namensraum immer in meine Wachen gelegt. Automatisierte Tools legen eine GUID als Header Guard fest. Der entscheidende Punkt ist, dass sie ** EINZIGARTIG sein müssen ** (nicht nur in Ihrem Projekt, sondern vorzugsweise einzigartig in allen Dateien auf der ganzen Welt in allen Dimensionen, wenn möglich). –