2009-03-24 10 views
30

Ich sehe so viel Code einschließlich stdafx.h. Sprich, ich mache nicht wollen vorkompilierte Header. Und ich wird alle erforderlichen System-Header selbst manuell aufnehmen. Gibt es in diesem Fall einen anderen guten Grund, warum ich wissen sollte, wo ich stdafx.h benötige?stdafx.h: Wann brauche ich es?

+0

(für alle, die dies als Referenz verwenden) Wenn Sie bereits vorkompilierte Header verwenden, gehen Sie zu den Projekteigenschaften, C/C++ und vorkompilierten Headern, und wählen Sie die Option, sie nicht zu verwenden. – MirroredFate

+0

StdAfx.h für Einsteiger: http://www.cplusplus.com/articles/2z86b7Xj/ –

Antwort

16

Wenn Sie keine vorkompilierten Header verwenden möchten, dann hat es keinen Sinn, eine Standard-Include-Datei zu verwenden - dies verlangsamt den Build für jede Datei, die sie enthält, und sie enthält zusätzliche Sachen, die sie nicht enthalten brauchen. Werden Sie los und fügen Sie nur die Header hinzu, die sie benötigen.

2

Auch ohne vorkompilierte Header kann stdafx.h nützlich sein, da es Header und Definitionen für alle Dateien gruppiert.

Sie können natürlich alle diese Definitionen in jeder Datei wiederholen. stdafx.h ist nicht unbedingt erforderlich.

+0

Schlechte Praxis - Sie sollten immer die Header, die Sie benötigen, explizit auflisten, damit Sie Modulabhängigkeiten überprüfen können. – snemarch

+0

stdafx enthält normalerweise plattformspezifische Definitionen, die für alle Dateien gelten. Es ist eine "Abhängigkeit" von jeder Datei. Sie verwenden es, um die Definitionen nicht in jeder Datei zu wiederholen. Dies ist eine gute Übung, weil Sie das nur an einem Ort tun. – kgiannakakis

+0

Es ist keine Abhängigkeit jeder Datei, es sei denn, jede Datei benötigt tatsächlich jeden Header in stdafx. In der Praxis ist dies selten der Fall (IME). Verwenden Sie es auf diese Weise ist im besten Fall faul, schlechte Praxis im schlimmsten Fall – Patrick

2

stdafx.h ist nur eine andere Header-Datei. Wenn Sie es nicht geschafft haben, brauchen Sie es nicht, es nicht aufzunehmen und aus dem Projekt zu entfernen.

Es ist jedoch ziemlich typisch, eine Datei wie stdafx.h genau zu haben, damit vorkompilierte Header funktionieren und nicht alles manuell in jeder Quelldatei enthalten sind.

1

Wie andere bereits erwähnt haben: Wenn Sie keine vorkompilierten Header benötigen, brauchen Sie stdafx.h nicht wirklich. Und es nur zu verwenden, um allgemeine Includes zu gruppieren, ist eigentlich eine ziemlich schlechte Übung.

In der Tat ist es auch bei der Verwendung vorkompilierter Header empfehlenswert, die Header einzufügen, die Ihr Prozess nach stdafx.h (oder vorcompiled.h oder wie immer Sie es nennen möchten) - zusammen mit #ifdef magic in Ihrem vorkompilierten Header, um die Verwendung von PCH zu deaktivieren.

Warum? Um Ihre Modulabhängigkeiten zu überprüfen. Wenn Sie Ihren PCH deaktivieren können, können Sie feststellen, ob Sie die erforderlichen Module enthalten oder nicht, und Sie können dann ein Tool schreiben, um die Interdependenzen Ihres Moduls zu prüfen, indem Sie Ihre .cpp- und .h-Dateien analysieren (natürlich ohne den PCH-Header).

+1

Yeah schreiben einen C++ Parser ist ein großer Zeitgewinn ......... – Virus721

2

Sie können vorkompilierte Header (die eine gute Sache sind) verwenden, ohne stdafx.h zu verwenden (ich verabscheue es auch). Ich habe nur Zugriff auf VC++ 6.0, aber gehen Sie zu Projekteinstellungen | C/C++ | Vorkompilierte Header und wählen Sie "automatische Verwendung von vorkompilierten Header", aber lassen Sie das Feld "kompiliert durch" leer.

0

Ich weiß, das ist ein alter Thread, aber ich dachte, ich würde meine Meinung an die Leser weitergeben. Ich habe das 2017 gefunden, also bin ich sicher, dass ich nicht der einzige bin, der hier sein wird.

Es gibt einen Vorteil, vorkompilierte Header zu verwenden, die von anderen übersehen werden können, weil sie ihre Praxis seit vielen Jahren verwenden. Der C++ - Standard hat sich stark weiterentwickelt. Anstatt Vektor in 20 Dateien zu integrieren, die Sie benötigen und oder und was auch immer, verwenden Sie eine PCH-Datei und der Compiler muss weniger arbeiten, und das macht fröhliche Gesichter für alle. Sie können auch Ihre allgemeinen Makros wie VERIFY, ASSERT und Smart-Class-Objekte einfügen. Setzen Sie Ihre Klassenüberschriften nicht dort ein, es würde keinen Sinn ergeben, eher die Standard-Bibliothek oder etwas, das Sie global an vielen Stellen verwenden müssen, wie den erwähnten Makros.

im Grunde realisieren, indem Sie die Header, die Sie benötigen in jeder Datei, die Sie benötigen, wie Iostream, Zeichenfolge und Vektor, Sie sammeln das effektiv jedes Mal als ein Inline zu der Datei. Fügen Sie einen "Pre Compiled" Header hinzu, nun sollte nur der Name eine Glocke läuten.