Wofür wird "stdafx.h" in Visual Studio verwendet?

Eine Datei namens "stdafx.h" wird automatisch generiert, wenn ich ein Projekt in Visual Studio 2010 starte. Ich muss eine plattformübergreifende C++-Bibliothek erstellen, so dass ich diese Header-Datei nicht verwenden kann/will.

Wofür wird "stdafx.h" verwendet? Ist es OK, wenn ich diese Header-Datei einfach entferne?

Lösung

Alle C++-Compiler haben ein ernsthaftes Leistungsproblem zu bewältigen. Die Kompilierung von C++-Code ist ein langer, langsamer Prozess.

Das Kompilieren von Headern, die in C++-Dateien enthalten sind, ist ein sehr langer, langsamer Prozess. Das Kompilieren der riesigen Header-Strukturen, die Teil der Windows-API und anderer großer API-Bibliotheken sind, ist ein sehr, sehr langer, langsamer Prozess. Dies immer und immer wieder für jede einzelne Cpp-Quelldatei tun zu müssen, ist ein Todesurteil.

Das ist kein Windows-spezifisches Problem, sondern ein altes Problem aller Compiler, die gegen eine große API wie Windows kompilieren müssen.

Der Microsoft-Compiler kann dieses Problem mit einem einfachen Trick namens vorkompilierte Header entschärfen. Der Trick ist ziemlich raffiniert: Obwohl jede CPP-Datei potenziell und rechtlich gesehen der Kette von Header-Dateien, die oben auf jeder CPP-Datei enthalten sind, eine geringfügig andere Bedeutung geben kann (z. B. durch verschiedene Makros, die vor den Includes #define'd sind, oder durch das Einfügen der Header in unterschiedlicher Reihenfolge), ist das in den meisten Fällen nicht der Fall. Meistens haben wir Dutzende oder Hunderte von Include-Dateien, aber sie sollen alle die gleiche Bedeutung für alle Cpp-Dateien haben, die in Ihrer Anwendung kompiliert werden.

Der Compiler kann eine enorme Zeitersparnis erzielen, wenn er nicht jedes Mal jede Cpp-Datei und ihre Dutzende von Includes buchstäblich von Grund auf kompilieren muss.

Der Trick besteht darin, eine spezielle Header-Datei als Startpunkt aller Kompilierungsketten zu bestimmen, die so genannte 'vorkompilierte Header' Datei, die aus historischen Gründen üblicherweise stdafx.h heißt.

Führen Sie einfach alle großen Header für Ihre APIs in der Datei stdafx.h in der richtigen Reihenfolge auf, und beginnen Sie dann jede Ihrer CPP-Dateien ganz oben mit einem #include "stdafx.h", vor jeglichem sinnvollen Inhalt (so ziemlich das einzige, was vorher erlaubt ist, sind Kommentare).

Unter diesen Bedingungen fängt der Compiler nicht vom Nullpunkt an, sondern kompiliert aus den bereits gespeicherten Ergebnissen der Kompilierung von allem in stdafx.h.

Ich glaube nicht, dass es diesen Trick nur bei Microsoft-Compilern gibt, und ich glaube auch nicht, dass es sich um eine ursprüngliche Entwicklung handelt.

Bei Microsoft-Compilern wird die Einstellung, die die Verwendung von vorkompilierten Headern steuert, durch ein Befehlszeilenargument an den Compiler gesteuert: /Yu "stdafx.h". Wie Sie sich vorstellen können, ist die Verwendung des Dateinamens stdafx.h einfach eine Konvention; Sie können den Namen ändern, wenn Sie dies wünschen.

In Visual Studio 2010 wird diese Einstellung von der grafischen Benutzeroberfläche aus gesteuert, indem Sie mit der rechten Maustaste auf ein CPP-Projekt klicken, 'Eigenschaften' auswählen und zu "Konfigurationseigenschaften\C/C++\Vorkompilierte Header" navigieren. Bei anderen Versionen von Visual Studio ist der Ort in der grafischen Benutzeroberfläche ein anderer.

Beachten Sie, dass, wenn Sie vorkompilierte Header deaktivieren (oder Ihr Projekt durch ein Tool laufen lassen, das diese nicht unterstützt), dies Ihr Programm nicht illegal macht; es bedeutet lediglich, dass Ihr Tool jedes Mal alles von Grund auf neu kompiliert.

Wenn Sie eine Bibliothek ohne Windows-Abhängigkeiten erstellen, können Sie #includes in der Datei stdafx.h einfach auskommentieren oder entfernen. Es besteht keine Notwendigkeit, die Datei an sich zu entfernen, aber Sie können dies natürlich auch tun, indem Sie die obige Einstellung für den Precompile-Header deaktivieren.

Kommentare (16)

Es handelt sich um eine "vorkompilierte Header-Datei" - alle Header, die Sie in stdafx.h einfügen, werden vorverarbeitet, um bei späteren Kompilierungen Zeit zu sparen. Sie können mehr darüber lesen [hier auf MSDN] (http://msdn.microsoft.com/en-us/library/h552b3ca.aspx).

Wenn Sie eine plattformübergreifende Anwendung erstellen, markieren Sie "Leeres Projekt", wenn Sie Ihr Projekt erstellen, und Visual Studio wird überhaupt keine Dateien in Ihr Projekt aufnehmen.

Kommentare (2)

Ich stieß gerade auf diese selbst, da ich versuche, mich ein Bare-Bones-Framework zu erstellen, aber begann mit dem Erstellen einer neuen Win32-Programmoption in Visual Studio 2017. stdafx.h ist unnötig und sollte entfernt werden. Dann können Sie die dummen "stdafx.h" und "stdafx.cpp" entfernen, die in Ihrem Projektmappen-Explorer sowie die Dateien aus Ihrem Projekt sind. An ihrer Stelle müssen Sie

#include 

ersetzen.

Kommentare (0)