2016-06-23 15 views
-1

Si je veux éviter les erreurs de redéclaration sans utiliser les protections incluses, la règle de base est que l'arbre des dépendances doit être: un ou plusieurs arbres seulement.Éviter les erreurs de redéclaration sans inclure les protections

Chaque fois qu'un parent peut être atteint de deux manières différentes, alors une violation se produit?

par exemple:

declarations.h comprend string.h
data.h comprend declarations.h
donnees.c comprennent data.h
ui.c comprend data.h et string.h

Ceci génère une erreur de redéclaration car à la fois ui.c et inclut string.h de deux manières différentes: directement et via data.h. Ainsi, la structure n'est pas un arbre, car ui.c a plusieurs chemins vers le même parent.

Existe-t-il un moyen d'avoir plusieurs chemins vers le même parent sans obtenir une erreur de redéclaration?

+1

Je ne comprends pas. Pourriez-vous énoncer vos hypothèses et votre vraie question plus clairement, s'il vous plaît? –

+1

Il est probablement * beaucoup * plus facile de trouver des gardes d'inclusion uniques que des arbres de dépendances uniques. Qu'est-ce que vous * essayez * vraiment de faire? –

+0

rendre la vie facile sur vous-même, TOUJOURS utiliser 'include guards' sur chaque fichier d'en-tête que vous écrivez. C'est facile, utilisez _h pour la garde d'inclusion. regardez n'importe quel fichier d'en-tête système pour: '#ifndef _h #define _h' et à la fin du fichier:' # endif' Ces trois lignes sont tout ce qui doit être ajouté au fichier d'en-tête pour avoir un 'include garde ' – user3629249

Répondre

0

Après avoir étudié ce problème pendant un certain temps, il semble que la forme graphique nécessaire ne soit pas un arbre. Fondamentalement, les dépendances seront propres tant que le graphique n'a pas de cycles et suit une règle cardinale unique qui est qu'il ne peut y avoir qu'un seul chemin vers un parent donné. Ainsi, par exemple:

enter image description here

Ainsi, dans ce réseau, nous voyons que les parents sont partagés, ainsi que les enfants peuvent être partagés, mais il n'y a nulle part qu'il ya plusieurs routes menant à tout parent donné du même enfant . Un terme mathématique pour la forme est un réseau disjoint. Dans un réseau disjoint, deux chemins peuvent partager uniquement un point de terminaison, mais aucun autre sommet/bord.

+0

Je vous suggère de commencer votre quête de la pureté avec votre compilateur et les fichiers d'inclusion du système. Assurez-vous que votre couverture inclut les définitions de dépendances entrecroisées (c.-à-d.modules qui ont tendance à s'appeler * l'un l'autre *), le prochain niveau de plaisir sera * callbacks * et leurs structures de données connexes – tofro

+0

@tofro Maintenant, c'est ce dont il s'agit! Pureté !!! –