2010-05-19 5 views
2

Je crée un petit framework C++, qui contient de nombreux fichiers .h et .cpp.Problèmes de garde d'en-tête C++

J'ai créé un général comprennent qui comprennent tout mon fichier .H tels que:

framework.h 

#include "A.h" 
#include "B.h" 
#include "C.h" 

chaque en-tête .h sont protégés par comprennent la garde tels que

#ifndef A_HEADER 
#define A_HEADER 
... 
#endif 

Les questions est, je aimerait être en mesure d'inclure "framework.h" à l'intérieur de tous les sub.h tels que, mais il provoque beaucoup d'erreur de compilation:

#ifndef A_HEADER 
#define A_HEADER 

#include "framework.h" 
... 
#endif 

Si à la place, j'utilise le vrai fichier d'en-tête pour chaque sous-entête, et le framework.h pour quoi que ce soit utilise mon framework ça marche bien ..

Je voudrais simplement inclure l'en-tête principal dans tout mon sub .h so Je n'ai pas besoin d'inclure toutes les dépendances à chaque fois.

Merci :)

+1

Quelles sont les erreurs que vous obtenez? Cela devrait fonctionner si les fichiers sont corrects. – Mark

+0

Peut-être avez-vous oublié les guillemets inclus dans framework.h? –

+0

Aucun problème de dépendance circulaire, mais des problèmes indéfinis, tout comme si j'avais oublié d'inclure un .h. Mosty pour chose sont définis en ligne dans certains fichiers d'en-tête. –

Répondre

7

Fondamentalement, ce que vous faites est #include "A.h" dans framework.h et #include "framework.h" dans A.h. Cela entraîne une dépendance cyclique des fichiers d'en-tête et vous obtiendrez des erreurs telles que la classe indéfinie A. Pour résoudre ce problème, utilisez les déclarations forward dans le fichier d'en-tête et #include uniquement dans le fichier cpp correspondant. Si ce n'est pas possible, je ne vois pas d'autre option que d'inclure des fichiers d'en-tête individuels.

0

je vous conseille d'utiliser #pragma once, et de placer ce en haut de tous vos fichiers d'en-tête (framework.h, A.h, B.h et C.h). Bien que, si vous préférez, je pense que vous pourriez résoudre votre problème en mettant simplement un garde d'inclusion dans framework.h aussi bien.

+0

S'il vous plaît ne pas utiliser #pragma une fois dans les cadres, nous les gens ordinaires détestent ces avertissements de dépréciation de g ++. – avakar

+2

Plus aucun problème. De Wikipédia: "Cependant, avec la version 3.4 de GCC, le code #pragma une fois manipulé a été corrigé pour se comporter correctement avec des liens symboliques et durs.La caractéristique était" non dépréciée "et l'avertissement enlevé" –

+0

Je suis corrigé. – avakar

2

Juste protéger l'en-tête principale avec notamment les gardes aussi:

#ifndef FRAMEWORK_H 
# define FRAMEWORK_H 
# include <A.h> 
# include <B.h> 
# include <C.h> 
#endif 

Cela permettra d'éviter l'inclusion récursive.

+0

Pas de problèmes de dépendances circulaires, mais des choses indéfinies, comme si j'avais oublié d'inclure un .h. Mosty pour chose sont définis en ligne dans certains fichiers d'en-tête. –

0

Je suppose que vous avez une dépendance entre - dire B et C tel que B dépend de C, mais dans framework.h C est inclus après B.

+0

Vous avez raison, mais Naveen a répondu en premier –

0

circulaire comprend sont généralement une mauvaise idée en C++. Alors que les gardes d'en-tête empêcheront le préprocesseur d'aller en boucle infinie (ou de lancer une erreur à cause de cela), vous obtiendrez des erreurs de compilation inattendues, car un fichier d'en-tête ne sera pas inclus si vous le pensez.

Vous devez inclure A.h, B.h et C.h de framework.h, et A.h, ne comprennent pas framework.h, simplement déclarer avant les classes que vous utilisez de celui-ci. Ou faites-le dans l'autre sens: inclure framework.h de A.h, B.h et C.h, et transmettre les classes dans framework.h. Et, bien sûr, mettre chaque code qui nécessiterait des déclarations plus détaillées que par exemple class A aux fichiers .cpp.

2

Vous ne devez pas inclure le fichier d'en-tête principal dans les fichiers de sous-en-tête. Il devrait être utilisé pour faciliter la vie de l'utilisateur, pas le vôtre.

faire au lieu suivant:

1) Faire avancer les définitions de tout ce que vous avez besoin dans les fichiers de sous-en-tête connexes.

2) Inclure uniquement les fichiers de sous-en-tête nécessaires dans les fichiers CPP.

3) Lorsque vous utilisez votre infrastructure dans un code d'application (par exemple), vous pouvez inclure le fichier d'en-tête de structure principal.

+0

+1 pour le processus – neuro