2016-08-21 25 views
1

Nehmen wir an, ich habe eine Header-Datei namens foo.h, und es enthält eine andere Kopfzeile, bar.h.C++, Soll ich etwas einschließen, wenn ich es brauche * und * noch etwas anderes?

Ich habe auch eine Header-Datei namens xyz.h. Es erfordert foo.h und bar.h, obwohl foo.h und bar.h nichts miteinander zu tun haben, so würde ich fühle mich seltsam nur umfassen foo.h (was immer noch da es bar.h ...

So enthält kompiliert, foo.h umfasst bar.h, bar.hnicht umfassen foo.h, aber xyz.hhat umfassen foo.h und bar.h. Ist die schlechte Praxis? gibt es einen Grund, warum soll ich nicht? Warum bin ich in der Lage, dies zu tun?

+2

Es ist allgemein üblich. Sie wissen nicht immer, welche anderen Header-Dateien eine Header-Datei enthält, also fügen Sie alle benötigten Header-Dateien hinzu. [#include guards] (https://en.wikipedia.org/wiki/Include_guard) verhindert Probleme, wenn der gleiche Header zweimal enthalten ist. – Barmar

+3

Jede Header-Datei sollte * alle * Header enthalten, die * es * ignorieren müssen, unabhängig davon, ob sie zufällig durch einen anderen Header eingefügt werden (weil sich das ändern kann). – Galik

+0

Suchen Sie nach "Include What You Use" über eine Suchmaschine. Es sollte http://include-what-you-use.org/ und https://github.com/include-what-you-use/include-what-you-use und andere Referenzen aufzeigen. –

Antwort

2

Jede Kopfzeile sollte in sich geschlossen sein. Es sollte alle anderen Header enthalten, die es benötigt, und include guards haben.

Angenommen, der Header war nicht eigenständig. Wenn Sie dann diesen Header in einem anderen Client verwenden möchten, würde der neue Client nicht einmal kompilieren, wenn Sie andere Header gefunden und gezogen haben.

Es kann auch einen seltenen Fall geben, wenn die Header-Datei nicht in sich geschlossen sein kann, z. prüft Google's code style für Details.

Die meisten Compiler unterstützen Optionen für die Untersuchung der Abhängigkeiten von Abhängigkeiten. Diese Optionen und andere Werkzeuge werden in dieser question diskutiert.

+0

Was Sie im ersten Absatz sagen, ist wahr - es wird oft als "in sich abgeschlossen und idempotent" bezeichnet. Diese Frage lautet jedoch: "Was bedeutet es, eigenständig zu sein", wenn mehrere Header beteiligt sind. Das Problem ist, dass ein Header A.h eigenständig sein kann, da er einen anderen Header B.h enthält, der wiederum C.h enthält, und C.h etwas definiert, das A.h verwendet. Während Bh weiterhin Ch benötigt, ist Ah in dem Sinne in sich geschlossen, dass es funktionieren wird, aber wenn sich Bh ändert, so dass es Ch nicht mehr benötigt, aber Ah immer noch Ch braucht, dann ist Ah nicht länger in sich selbst - weil Bh sich verändert hat . –

+0

@ JonathanLeffler Wenn 'A.h' etwas verwendet, das in' C.h' definiert ist, dann sollte es 'C.h' enthalten oder eine Forward-Deklaration für verwendetes Material haben. Ich verstehe es als "in sich geschlossene" Header. – Nikita

+1

Ich verstehe; Ich stimme zu.Aber wie zeigen Sie, dass A.h nicht in sich abgeschlossen ist, während B.h noch C.h enthält? Siehe [Sollte ich '# include' in Überschriften verwenden?] (Http://stackoverflow.com/questions/1804486) für die Sicht des C-Programmierers auf Dinge, und einige ziemlich effektive Möglichkeiten, die Selbsteindämmung zu gewährleisten. Aber der "ziemlich effektive Weg" ist anfällig für das oben beschriebene Szenario von A.h, B.h, C.h - und es gibt keine triviale Möglichkeit, dies zu vermeiden. Siehe http://Include-What-You-Use.org/ etc. –

Verwandte Themen