Un fichier nommé stdafx.h
est automatiquement généré lorsque je démarre un projet dans Visual Studio 2010. J'ai besoin de créer une bibliothèque C ++ multiplateforme, donc je n'utilise / ne peux pas utiliser ce fichier d'en-tête.
À quoi stdafx.h
sert-il? Puis-je supprimer ce fichier d'en-tête?
Réponses:
Tous les compilateurs C ++ ont un sérieux problème de performances à résoudre. La compilation de code C ++ est un processus long et lent.
La compilation des en-têtes inclus au-dessus des fichiers C ++ est un processus très long et lent. La compilation des énormes structures d'en-tête qui font partie de l'API Windows et d'autres grandes bibliothèques d'API est un processus très , très long et lent. Devoir le faire encore et encore et encore et encore pour chaque fichier source Cpp est un glas.
Ce n'est pas unique à Windows, mais un vieux problème rencontré par tous les compilateurs qui doivent compiler avec 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 astucieuse: bien que chaque fichier CPP puisse potentiellement et légalement donner une signification légèrement différente à la chaîne de fichiers d'en-tête inclus au-dessus de chaque fichier Cpp (par des choses comme avoir différentes macros # définies avant les inclusions, ou en incluant les en-têtes dans un ordre différent), ce qui n’est le plus souvent pas le cas. La plupart du temps, nous avons des dizaines ou des centaines de fichiers inclus, mais ils sont tous destinés à avoir la même signification pour tous les fichiers Cpp en cours de compilation dans votre application.
Le compilateur peut faire d'énormes gains de temps s'il n'a pas à commencer à compiler chaque fichier Cpp plus 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 dit «en-tête précompilé», qui est généralement un fichier nommé stdafx.h simplement pour des raisons historiques.
Listez simplement tous vos gros en-têtes énormes 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 avant est commentaires).Dans ces conditions, au lieu de partir de zéro , le compilateur commence à compiler à partir des résultats déjà enregistrés de tout compiler
stdafx.h
.Je ne pense pas que cette astuce soit propre aux compilateurs Microsoft, et je ne pense pas non plus que ce soit 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 pour le compilateur:
/Yu "stdafx.h"
. Comme vous pouvez l'imaginer, l'utilisation dustdafx.h
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 naviguant vers «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 mettre en commentaire ou supprimer des
#include
s dustdafx.h
fichier. Il n'est pas nécessaire de supprimer le fichier en soi, mais vous pouvez clairement le faire également en désactivant le paramètre d'en-tête de précompilation ci-dessus.la source
#include "stdafx.h"
? Bien sûr, mais ce n'est qu'un #include standard. La partie "extension MS" n'est qu'une optimisation des performances du compilateur; cela ne change pas la sémantique d'avoir un fichier d'en-tête qui se trouve être appelé "stdafx.h". Notez que si vous supprimez l'inclusion et que votre code dépend de tout ce qui a été inclus via stdafx.h, vous devrez l'inclure directement.#include
les avez dans le fichier source (fait par la même étape de «préprocesseur» qui évalue les macros). Le fichier total résultant est ensuite transmis au compilateur réel, qui ne voit jamais un fichier d'en-tête comme une entité distincte. Vous ne mettez des déclarations sur le fichier d'en-tête que parce que c'est ce qui fonctionne bien sur un fichier d'en-tête - c'est une règle conventionnelle. Essayez! Créez un fichier d'en-tête avec un programme entier, puis créez un fichier source qui n'a qu'un #include pour lui. Il compile très bien.Il s'agit d'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 suivantes. Vous pouvez en savoir plus à ce sujet ici sur MSDN .
Si vous créez une application multiplateforme, cochez la case "Projet vide" lors de la création de votre projet et Visual Studio ne placera aucun fichier dans votre projet.
la source
"Stdafx.h" est un en-tête précompilé. Il comprend un fichier pour les fichiers d'inclusion système standard et pour les fichiers d'inclusion spécifiques au projet qui sont utilisés fréquemment mais sont rarement modifiés. Ce qui réduit le temps de compilation et le traitement inutile.
En-tête précompilé stdafx.h est essentiellement utilisé dans Microsoft Visual Studio pour permettre au compilateur de connaître les fichiers qui sont une fois compilés et pas besoin de les compiler à partir de zéro. Vous pouvez en savoir plus à ce sujet
http://www.cplusplus.com/articles/1TUq5Di1/
https://docs.microsoft.com/en-us/cpp/ide/precompiled-header-files?view=vs-2017
la source
Je viens de rencontrer cela moi-même depuis que j'essaie de me créer un cadre de base, mais j'ai commencé par créer une nouvelle option de programme Win32 dans Visual Studio 2017. "stdafx.h" est inutile et doit être supprimé. Ensuite, vous pouvez supprimer les stupides "stdafx.h" et "stdafx.cpp" qui se trouvent dans votre explorateur de solutions ainsi que les fichiers de votre projet. À sa place, vous devrez mettre
au lieu.
la source