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

500

Eine Datei mit dem Namen stdafx.hwird 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.hverwendet? Ist es in Ordnung, dass ich nur diese Header-Datei entferne?

prosseek
quelle
2
Wenn ich einen Kompilierungsfehler in Bezug auf stdafx.h erhalte, stelle ich im Allgemeinen die Einstellungen so ein, dass diese Datei nicht erstellt oder verwendet wird.
phoad
6
Artikel: StdAfx.h für Anfänger - viva64.com/de/b/0265
Sie können die Header-Datei problemlos auf anderen Plattformen verwenden. Für sie ist dies nur eine normale Header-Datei. Es bietet dort einfach keinen Leistungsvorteil.
Andrea

Antworten:

826

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 des stdafx.hDateinamens 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 #includes einfach auskommentieren oder aus der stdafx.hDatei 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.

Euro Micelli
quelle
6
Selbst wenn Sie nur für Dateien aus dem Standard-Namespace verwendet haben, erhalten Sie einen Geschwindigkeitsvorteil
Ghita
11
omg, sehr nette Antwort in der Tat. Ich suchte nach einem standardkonformen c-Compiler. Es stellt sich heraus, dass ich viele Erweiterungen aus den Projekteigenschaften deaktivieren, den Compiler von "auto" auf "c" ändern kann und Sie so ziemlich "Standard" -Compiler und IDE haben.
EKanadily
4
@ Rishi: Mit "Linie" meinst du #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.
Euro Micelli
4
@ Youda008, nicht ganz richtig. Vor dem Kompilieren einer Codedatei wird der Inhalt von Headern einfach und buchstäblich an der Stelle "eingefügt", an der Sie #includeihn 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.
Euro Micelli
28
Historische Neugier. Der Name von stdafx.h stammt aus der Zeit um 1992, als MFC vor seiner Veröffentlichung als "Application Framework Extensions" bezeichnet wurde. Visual Studio 2015 verwendet standardmäßig immer noch den Namen ..
kert
48

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.

casablanca
quelle
15
Diese Datei enthält nichts, was auf anderen Plattformen nicht funktionieren würde. Dies kann die Kompilierung dort verlangsamen, wenn der Compiler keine vorkompilierten Header unterstützt, diese jedoch nicht beschädigen sollte. Es ist nur eine Header-Datei, die andere Header-Dateien enthält.
verstimmt am
2
@detunized: Vielleicht hat meine Antwort dazu geführt, dass es anders klingt, also danke, dass du diesen Teil geklärt hast.
Casablanca
3

"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

Akash das
quelle
-10

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

#include <Windows.h>

stattdessen.

Adam H.
quelle