Question À quoi sert "stdafx.h" dans Visual Studio?


Un fichier nommé stdafx.h est automatiquement généré lorsque je lance un projet dans Visual Studio 2010. Je dois créer une bibliothèque C ++ multi-plateforme, donc je ne peux / ne peux pas utiliser ce fichier d'en-tête.

Quel est stdafx.h utilisé pour? Est-il correct que je viens de supprimer ce fichier d'en-tête?


435
2018-01-18 16:00


origine


Réponses:


Tous les compilateurs C ++ ont un sérieux problème de performance à gérer. La compilation du code C ++ est un processus long et lent.

La compilation des en-têtes inclus dans les fichiers C ++ est un très long, processus lent. Compiler les énormes structures d'en-tête qui font partie de l'API Windows et d'autres grandes bibliothèques API est un très, très long, processus lent. Avoir à le faire plus, et plus, et plus pour chaque fichier source Cpp unique est un glas.

Ce n'est pas unique à Windows mais un vieux problème rencontré par tous les compilateurs qui doivent compiler contre une grande API comme Windows.

Le compilateur Microsoft peut améliorer ce problème avec une astuce simple appelée en-têtes précompilés. L'astuce est assez simple: bien que chaque fichier CPP puisse potentiellement et légalement donner un sens légèrement différent à la chaîne de fichiers d'en-tête incluse dans chaque fichier Cpp (par exemple, avoir des macros différents # définis avant les inclusions ou en incluant les en-têtes dans un ordre différent), le plus souvent ce n'est pas le cas. La plupart du temps, nous avons des dizaines ou des centaines de fichiers inclus, mais tous sont destinés à avoir la même signification pour tous les fichiers Cpp compilés dans votre application.

Le compilateur peut économiser énormément de temps s'il n'a pas besoin de commencer à compiler tous les fichiers Cpp, en plus de ses dizaines d'inclusions littéralement à partir de zéro à chaque fois.

L'astuce consiste à désigner un fichier d'en-tête spécial comme point de départ de toutes les chaînes de compilation, le fichier appelé «en-tête précompilé», qui est généralement un fichier nommé stdafx.h simplement pour des raisons historiques.

Énumérez simplement tous vos gros en-têtes pour vos API dans votre fichier stdafx.h, dans l’ordre approprié, puis démarrez chacun de vos fichiers CPP tout en haut avec un #include "stdafx.h", avant tout contenu significatif (à peu près la seule chose autorisée auparavant est les commentaires).

Dans ces conditions, au lieu de commencer à partir de rien, le compilateur commence à compiler à partir des résultats déjà enregistrés de la compilation de tout dans stdafx.h.

Je ne crois pas que cette astuce est unique aux compilateurs Microsoft, et je ne pense pas que c'était un développement original.

Pour les compilateurs Microsoft, le paramètre qui contrôle l'utilisation des en-têtes précompilés est contrôlé par un argument de ligne de commande au compilateur: /Yu "stdafx.h". Comme vous pouvez l'imaginer, l'utilisation de stdafx.h le nom de fichier est simplement une convention; vous pouvez changer le nom si vous le souhaitez.

Dans Visual Studio 2010, ce paramètre est contrôlé à partir de l'interface graphique via un clic droit sur un projet CPP, en sélectionnant "Propriétés" et en accédant à "Propriétés de configuration \ C / C ++ \ En-têtes précompilés". Pour les autres versions de Visual Studio, l'emplacement dans l'interface graphique sera différent.

Notez que si vous désactivez les en-têtes précompilés (ou exécutez votre projet via un outil qui ne les prend pas en charge), cela ne rend pas votre programme illégal. Cela signifie simplement que votre outil compilera tout à partir de zéro à chaque fois.

Si vous créez une bibliothèque sans dépendances Windows, vous pouvez facilement commenter ou supprimer #includes du fichier stdafx.h. Il n'est pas nécessaire de supprimer le fichier en tant que tel, mais vous pouvez également le faire en désactivant le paramètre d'en-tête de précompilation ci-dessus.


729
2018-01-18 17:07



C'est un "fichier d'en-tête précompilé" - tous les en-têtes que vous incluez dans stdafx.h sont pré-traités pour gagner du temps lors des compilations ultérieures. Vous pouvez en lire plus à ce sujet ici sur MSDN.

Si vous créez une application multiplate-forme, cochez "Vider projet" lors de la création de votre projet et Visual Studio ne mettra aucun fichier dans votre projet.


37
2018-01-18 16:03



Je suis juste tombé dessus moi-même depuis que j'essaye de me créer un cadre de bare bones mais ai commencé en créant une nouvelle option de programme de Win32 dans Visual Studio 2017. "stdafx.h" est inutile et devrait être enlevé. Ensuite, vous pouvez supprimer les stupides "stdafx.h" et "stdafx.cpp" qui se trouvent dans votre Solution Explorer ainsi que les fichiers de votre projet. Dans ce lieu, vous devrez mettre

#include <Windows.h>

au lieu.


1
2018-05-04 19:08