Comment résolvez-vous créé en incluant un fichier d'en-tête du même nom qu'un autre fichier d'en-tête déjà indirectement inclus à la suite d'un autre include?C++: inclure plusieurs fichiers d'en-tête ayant le même nom d'espaces de noms différents
Par exemple:
// 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
Dans le dernier fichier d'en-tête, a.hpp ne seront pas inclus en raison des multiples agents de préprocesseur d'inclusion. Vraiment, cela devrait être correct mais puisque les classes sont dans des espaces de noms différents. Je me rends compte que le moyen le plus simple est de simplement changer le nom de foo/a.hpp ou juste de lui donner un faux nom dans la garde d'inclusion multiple. Y a-t-il un meilleur moyen?
EDIT Je comprends que vous pouvez résoudre ce problème en utilisant un nom plus descriptif dans les directives #define et #ifndef (par exemple FOO_A_HPP et BLAH_A_HPP), mais je veux savoir si cela est la meilleure façon recommandée ou . Est-ce que certaines personnes recommandent d'utiliser un nom de fichier différent comme meilleure solution ou n'est-ce pas important? Recommanderiez-vous en utilisant la convention:
<NAMESPACE>_<CLASS>_HPP
au lieu de
<CLASS>_HPP
pour donner une meilleure chance d'éviter ces problèmes en général?
Pourquoi est-ce marqué C? –
Je place toujours l'espace de noms dans mes gardes. Les outils automatisés mettront un GUID comme garde d'en-tête. L'essentiel est qu'ils DOIVENT être uniques (pas seulement dans votre projet, mais de préférence unique dans tous les fichiers du monde dans toutes les dimensions si possible). –