2016-06-23 19 views
-1

Wenn ich Re-Deklarationsfehler vermeiden möchte, ohne Include-Guards zu verwenden, ist die Grundregel, dass der Abhängigkeitsbaum so aussehen muss: ein oder mehrere Bäume.Vermeidung von Re-Deklarationsfehlern ohne Include-Guards

Jedes Mal, wenn ein Elternteil auf zwei verschiedene Arten erreicht werden kann, tritt ein Verstoß auf?

zum Beispiel:

declarations.h umfasst string.h
data.h umfasst declarations.h
data.c umfassen data.h
ui.c data.h umfasst und string.h

Dies erzeugt einen Deklarationsfehler, da sowohl ui.c als auch string.h zwei verschiedene Möglichkeiten beinhalten: direkt und über data.h. Daher ist die Struktur kein Baum, da ui.c mehrere Pfade zum selben Elternteil hat.

Gibt es eine Möglichkeit, mehrere Pfade zum gleichen Elternteil zu haben und keinen Re-Deklarationsfehler zu bekommen?

+1

Ich verstehe es nicht. Könnten Sie bitte Ihre Annahmen und Ihre wirkliche Frage deutlicher formulieren? –

+1

Es ist wahrscheinlich * viel * einfacher, einzigartige Wächter aufzuweisen als eindeutige Abhängigkeitsbäume. Was versuchst du wirklich? –

+0

machen das Leben einfach für sich selbst, verwenden Sie IMMER "include guards" auf jede Header-Datei, die Sie schreiben. Es ist einfach, verwenden Sie _h für den Include-Guard. Sehen Sie sich eine System-Header-Datei an: '#ifndef _h #define _h' und am Ende der Datei:' # endif' Diese drei Zeilen sind alles, was zur Header-Datei hinzugefügt werden muss, um ein 'include' zu haben Wache ' – user3629249

Antwort

0

Nachdem wir dieses Problem einige Zeit studiert haben, scheint es, dass die notwendige Graphform kein Baum ist. Grundsätzlich sind die Abhängigkeiten sauber, solange der Graph keine Zyklen hat und einer einzigen Grundregel folgt, dass es nur einen einzigen Pfad zu einem bestimmten Elternteil geben kann. So zum Beispiel:

enter image description here

Also, in diesem Netzwerk, das wir sehen, dass die Eltern gemeinsam genutzt werden, und auch können die Kinder gemeinsam genutzt werden, aber es gibt nirgendwo, dass es mehrere Routen zu einem bestimmten Elternteil aus dem gleichen Kind . Ein mathematischer Ausdruck für die Form ist ein disjunktes Netzwerk. In einem nicht zusammenhängenden Netzwerk können zwei beliebige Pfade nur einen Endpunkt, aber keinen anderen Scheitelpunkt/keine andere Kante teilen.

+0

Ich würde vorschlagen, dass Sie Ihre Suche nach Reinheit mit Ihrem Compiler und System Include-Dateien beginnen. Stellen Sie sicher, dass Sie Includes einschließen, die Kreuzungsabhängigkeiten definieren (z.Module, die dazu tendieren, * einander * zu nennen), nächste Stufe des Spaßes wird * Callbacks * und ihre zugehörigen Datenstrukturen sein – tofro

+0

@tofro Jetzt geht es darum! Reinheit !!! –