Eine Datei mit dem Namen stdafx.h
wird automatisch generiert, wenn ich ein Projekt in Visual Studio 2010 starte. Ich muss eine plattformübergreifende C ++ - Bibliothek erstellen, damit ich diese Header-Datei nicht verwenden kann / kann.
Wofür wird stdafx.h
verwendet? Ist es in Ordnung, dass ich nur diese Header-Datei entferne?
Antworten:
Alle C ++ - Compiler haben ein ernstes Leistungsproblem zu lösen. Das Kompilieren von C ++ - Code ist ein langer und langsamer Prozess.
Das Kompilieren von Headern, die über C ++ - Dateien enthalten sind, ist ein sehr langer und 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 und langsamer Prozess. Es für jede einzelne Cpp-Quelldatei immer und immer wieder tun zu müssen, ist ein Todesstoß.
Dies gilt nicht nur für Windows, sondern ist ein altes Problem, mit dem alle Compiler konfrontiert sind, die mit einer großen API wie Windows kompilieren müssen.
Der Microsoft-Compiler kann dieses Problem mit einem einfachen Trick beheben, der als vorkompilierte Header bezeichnet wird . Der Trick ist ziemlich raffiniert: Obwohl jede CPP-Datei der Kette der Header-Dateien, die über jeder Cpp-Datei enthalten sind, möglicherweise und rechtlich eine geringfügig andere Bedeutung geben kann (z. B. indem vor dem Einschließen unterschiedliche Makros # definiert werden oder durch Einfügen der Überschriften in unterschiedlicher Reihenfolge) ist dies meistens nicht der Fall. Meistens sind Dutzende oder Hunderte von Dateien enthalten, aber alle sollen für alle in Ihrer Anwendung kompilierten Cpp-Dateien dieselbe Bedeutung haben.
Der Compiler kann enorm viel Zeit sparen, wenn er nicht jedes Mal mit dem Kompilieren jeder Cpp-Datei und seiner Dutzenden von Includes beginnen muss.
Der Trick besteht darin, eine spezielle Header-Datei als Ausgangspunkt für alle Kompilierungsketten festzulegen, die sogenannte "vorkompilierte Header" -Datei, die üblicherweise aus historischen Gründen eine Datei mit dem Namen stdafx.h ist .
Listen Sie einfach alle Ihre großen, riesigen Header für Ihre APIs in Ihrer stdafx.h-Datei in der entsprechenden Reihenfolge auf und starten Sie dann jede Ihrer CPP-Dateien ganz oben mit einem
#include "stdafx.h"
vor aussagekräftigen Inhalten (fast das einzige, was vorher erlaubt ist) Bemerkungen).Unter diesen Bedingungen beginnt der Compiler , anstatt von vorne zu beginnen , mit dem Kompilieren aus den bereits gespeicherten Ergebnissen des Kompilierens
stdafx.h
.Ich glaube nicht, dass dieser Trick nur für Microsoft-Compiler gilt, und ich glaube auch nicht, dass es sich um eine originelle Entwicklung handelt.
Bei Microsoft-Compilern wird die Einstellung, die die Verwendung vorkompilierter Header steuert, durch ein Befehlszeilenargument an den Compiler gesteuert :
/Yu "stdafx.h"
. Wie Sie sich vorstellen können, ist die Verwendung desstdafx.h
Dateinamens lediglich eine Konvention. Sie können den Namen ändern, wenn Sie dies wünschen.In Visual Studio 2010 wird diese Einstellung über die GUI 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 Speicherort in der GUI anders.
Beachten Sie, dass Ihr Programm nicht illegal wird, wenn Sie vorkompilierte Header deaktivieren (oder Ihr Projekt über ein Tool ausführen, das sie nicht unterstützt). Es bedeutet einfach, dass Ihr Tool jedes Mal alles von Grund auf neu kompiliert.
Wenn Sie eine Bibliothek ohne Windows-Abhängigkeiten erstellen, können Sie
#include
s einfach auskommentieren oder aus derstdafx.h
Datei entfernen . Es ist nicht erforderlich, die Datei per se zu entfernen, aber Sie können dies natürlich auch tun, indem Sie die Einstellung für den vorkompilierten Header oben deaktivieren.quelle
#include "stdafx.h"
? Sicher, aber das ist nur ein Standard #include. Der Teil "MS-Erweiterung" ist nur eine Optimierung der Compilerleistung. Es ändert nichts an der Semantik einer Header-Datei, die zufällig "stdafx.h" heißt. Beachten Sie, dass Sie das Include direkt einschließen müssen, wenn Sie das Include entfernen und Ihr Code von allem abhängt, was über stdafx.h aufgenommen wurde.#include
ihn in die Quelldatei eingefügt haben (ausgeführt durch denselben "Präprozessor" -Schritt, der Makros auswertet). Die resultierende Gesamtdatei wird dann an den eigentlichen Compiler übergeben, der eine Header-Datei niemals als separate Entität sieht. Sie geben nur Deklarationen für die Header-Datei ab, da dies für eine Header-Datei gut funktioniert - dies ist eine herkömmliche Regel. Versuch es! Erstellen Sie eine Header-Datei mit einem ganzen Programm und erstellen Sie dann eine Quelldatei, die nur ein #include enthält. Es kompiliert gut.Es handelt sich um eine "vorkompilierte Header-Datei". Alle in stdafx.h enthaltenen Header werden vorverarbeitet, um bei nachfolgenden Kompilierungen Zeit zu sparen. Sie können hier auf MSDN mehr darüber lesen .
Wenn Sie eine plattformübergreifende Anwendung erstellen, aktivieren Sie beim Erstellen Ihres Projekts die Option "Projekt leeren", und Visual Studio fügt überhaupt keine Dateien in Ihr Projekt ein.
quelle
"Stdafx.h" ist ein vorkompilierter Header. Es enthält eine Include-Datei für Standard-System-Include-Dateien und für projektspezifische Include-Dateien, die häufig verwendet werden, aber nur selten geändert werden. Dies reduziert die Kompilierungszeit und die unnötige Verarbeitung.
Der vorkompilierte Header stdafx.h wird im Wesentlichen in Microsoft Visual Studio verwendet, um den Compiler über die einmal kompilierten Dateien zu informieren und sie nicht von Grund auf neu kompilieren zu müssen. Sie können mehr darüber lesen
http://www.cplusplus.com/articles/1TUq5Di1/
https://docs.microsoft.com/en-us/cpp/ide/precompiled-header-files?view=vs-2017
quelle
Ich bin selbst darauf gestoßen, da ich versuche, mir ein Bare-Bones-Framework zu erstellen, aber zunächst eine neue Win32-Programmoption in Visual Studio 2017 erstellt habe. "Stdafx.h" ist nicht erforderlich und sollte entfernt werden. Dann können Sie die dummen "stdafx.h" und "stdafx.cpp", die sich in Ihrem Projektmappen-Explorer befinden, sowie die Dateien aus Ihrem Projekt entfernen. An seiner Stelle müssen Sie setzen
stattdessen.
quelle