2013-03-27 17 views
9

Ich habe einige Projekte (oft Game-Engines) gesehen, bei denen alle Header-Includes in einer einzigen Header-Datei untergebracht sind, die manchmal auch Makros usw. enthält.Master-Include-Dateien - gute oder schlechte Praxis

// Master.h 

#include "header1.h" 
#include "header2.h" 
#include "header3.h" 
. 
. 
#include "headerN.h" 

Dann bei der Verwendung von Code wäre der Standard nur Master.h-Datei enthalten.

Andere Projekte arbeiten auf der Grundlage, dass die Quelldateien nur die Header enthalten sollten, die sie benötigen.

Was ich wissen möchte ist, wenn es eine definitive Antwort auf Best Practice gibt, vorzugsweise mit messbaren Ergebnissen, oder ist es persönliche Präferenz?

+1

Man ist die beste Praxis, die andere ist faule Praxis. : D –

+1

Neben der Lazy-Methode hilft es neuen Benutzern, die Bibliothek einfach zu benutzen, ohne wissen zu müssen, wo sich die Klassen/Methoden/etc befinden. Aber der (imho) riesige Nachteil ist der negative Einfluss auf die Kompilierzeit – stefan

+0

Ok bis jetzt sehe ich, dass ein Master-Include ist eine faule Methode, hat aber einige Vorteile, d. H. Neue Benutzer. Bedeutet das, dass die andere Methode best practice wäre und Leistungsvorteile hätte? – Zammalad

Antwort

7

Die meisten Antworten beziehen sich auf die Kompilierungszeit und ignorieren die Tatsache, dass die Vorkompilierung von Headern große Vorteile bei der Kompilierung bietet und mit der Master-Header-Technik viel besser funktioniert.

Vorzugsweise sollten Ihre Header funktionieren, wenn sie direkt ohne Master-Header-Datei enthalten sind (dies erleichtert das Testen). Moderne Compiler haben die Logik "Header überspringen, wenn mehrfach enthalten" optimiert.

+0

Danke, das ist eine weitere großartige Antwort. Ich muss zugeben, dass ich nicht viel über vorkompilierte Header weiß, besonders seit ich gerade in die Entwicklung in XCode gewechselt bin und alles ist neu für mich dort (verwendet, um alles in Visual Studio zu tun). – Zammalad

+0

@Zgalad: Der Visual Studio-Assistent "neues Projekt" verwendet die Master-Header-Methode. sie nennen es 'stdafx.h' –

2

definitiv eine schlechte Praxis vom Standpunkt der Kompilierungszeit, da Ihr Projekt von Grund auf neu kompiliert werden muss, jedes Mal, wenn die Datei geändert oder einer der enthaltenen Header berührt wird.

Als Faustregel sollten Sie so wenig Header wie möglich in Ihre Quelldateien einfügen. Ich kann jedoch einige Situationen sehen, in denen dies nützlich sein könnte, mit 3rd-Party-Bibliotheken, die sich nicht sehr oft ändern.

+0

Es ist auch nützlich für Header, die in der Mehrzahl der Kompilierungseinheiten benötigt werden, da Sie die Möglichkeit haben, vorkompilierte Header zu verwenden und nicht viel in Bezug auf minimale Neuerstellungsmöglichkeiten verlieren. –

+0

nie benutzt, scheint, dass Sie einen Punkt in diesem Fall haben – mirlitone

2

Da C++ ist teuer und kann besonders langsam sein, würde ich sagen, dass Sie einige zusätzliche vermeiden können die Verarbeitung und Analyse der Zeit durch Vermeiden unnötiger Einfügung nicht verwendeter Header, wenn viele Header-Dateien vorhanden sind (oder es gibt viele Implementierungsdateien, die wiederum Header enthalten).

Das ist für die Implementierung der Bibliothek (Sie beziehen sich auf Game-Engines lässt mich denken, dass wir hier über Bibliotheken sprechen). Jetzt können Sie auf jeden Fall eine "Master" -Informationsdatei erstellen, die diejenigen enthält, die die Bibliothek verwenden und alles an einem Ort haben möchten (und nicht Tausende von Dateien gleichzeitig haben).

+0

Ausgezeichnet, das gibt ziemlich viel Klarheit in dem, was ich wollte. Meine erste Frage war nicht so klar, wie ich es mir erhofft hatte, aber Sie haben den Nagel auf den Kopf getroffen. Wenn ich dich richtig verstehe, schließe nur das ein, was du in der Bibliotheksentwicklung brauchst. Dann kann eine einzelne Master-Include-Datei zur Verwendung der Bibliothek erstellt werden. – Zammalad

+0

@Zmalalad ... wenn der Benutzer der Bibliothek nicht viele Dateien hat (was ein Muster sein kann - die Bibliothek ist schneller und kürzer als das Schreiben, richtig?) –

+0

Ja, ich bin bei dir. Wenn der Code des Benutzers selbst viele Dateien umfasste, kann ich sehen, dass dies kontraproduktiv wäre. Ein bisschen Spagat. – Zammalad

0

Meiner Meinung nach sind die 5 Sekunden, die Sie gewinnen, indem Sie den Namen der richtigen Header-Datei nicht eingeben, die potentiell enorme Zunahme der Kompilierzeit, die durch diese Methode induziert wird, nicht wert.

Ich würde sagen, das ist schlechte Praxis.

Wie H2CO3 jedoch gesagt hat, kann die Möglichkeit, eine Master-Header-Datei für den Endbenutzer eines Frameworks zu verwenden, sehr hilfreich sein. GTK macht das, wenn ich mich gut erinnere.

+1

5 Sekunden ist grob optimistisch für die Zeit, die zum genauen Schreiben und Pflegen der Liste aller Abhängigkeiten einer Quelldatei benötigt wird. –

+0

Normalerweise enthalten Sie, was Sie brauchen, während Sie programmieren, nicht einmal Ihre Quelldateien sind 1000 Zeilen lang. In diesem Fall, ja, würde es mehr als 5 Sekunden dauern, aber warum würden Sie in einer solchen Position sein? – cmc

+0

Egal, in welcher Position Sie sind, die Arbeit muss getan werden. Wenn es mehrere Male 5 Sekunden dauert (einmal pro Include), dann sind das mehr als 5 Sekunden. Der nicht-triviale Teil ist während der Wartung, wenn Sie Code aus der Datei entfernen und entscheiden, ob das bedeutet, dass Sie eine Abhängigkeit entfernt haben und ein Include herausnehmen können. Diese Arbeit lohnt sich im Allgemeinen, aber so zu tun, als ob es überhaupt keine Arbeit wäre, ist es nicht die Art, sie zu rechtfertigen. –

1

Ich würde auch hinzufügen, dass einschließlich nur benötigte Header, wenn die Bibliothek einen Master bietet eine ziemlich schlechte Idee ist. Es kommt häufig vor, dass ein solcher Header nicht alles enthält, was er benötigt, sondern vielmehr davon abhängt, dass der Master-Header alle erforderlichen Header zuvor enthält. Also, wenn Sie Benutzer der Bibliothek sind, haben Sie normalerweise nicht viel Auswahl und sollten dem vom Autor vorgeschlagenen Weg folgen.

Dies ist auch der Grund, warum Master-Header als schlechte Praxis betrachtet werden kann - es macht es schwieriger, einen solchen Fall zu erkennen, wie ich oben beschrieben habe.

0

Ich denke, dass einige Fragen in C++ - und auch diese - man sich durch die Erinnerung an die C++ beantworten kann „Mantra“

zahlen nicht für das, was Sie nicht verwenden.

Speichern Sie Ihre Benutzer (d. H. Die Verbraucher Ihrer Code/Bibliothek) Rechenkosten (Laufzeit und Kompilierzeit) wo immer möglich. Verschmutzen Sie keinen Namespace und werfen Sie mehr Compiler (auch Syntax-Highlighter usw.) als nötig. Ich denke es ist C++'s Art höflich zu sein :)

Verwandte Themen