À quoi sert «stdafx.h» dans Visual Studio?

500

Un fichier nommé stdafx.hest 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.hsert-il? Puis-je supprimer ce fichier d'en-tête?

prosseek
la source
2
Si j'obtiens une erreur de compilation liée à stdafx.h, je règle généralement les paramètres pour ne pas créer ou utiliser ce fichier ..
phoad
6
Article: StdAfx.h pour les novices - viva64.com/en/b/0265
Vous pouvez très bien utiliser le fichier d'en-tête sur d'autres plates-formes, pour eux, c'est juste un fichier d'en-tête normal. Il n'offre tout simplement aucun avantage en termes de performances.
Andrea

Réponses:

826

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 du stdafx.hnom 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 #includes du stdafx.hfichier. 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.

Euro Micelli
la source
6
Même si vous avez utilisé uniquement des fichiers de l'espace de noms std, vous bénéficiez d'un avantage en
termes de
11
omg, réponse très agréable en effet. je cherchais un compilateur c conforme standard. il s'avère que je peux désactiver les extensions micro $ oft des propriétés du projet, changer le compilateur de "auto" en "c" et vous avez à peu près un compilateur et un IDE "standard".
EKanadily
4
@Rishi: par «ligne», tu veux dire #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.
Euro Micelli
4
@ Youda008, pas tout à fait vrai. Avant de compiler un fichier de code, le contenu des en-têtes est simplement et littéralement «collé» à l'endroit où vous #includeles 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.
Euro Micelli
28
Curiosité historique. Le nom de stdafx.h date d'environ 1992, lorsque MFC était appelé «Application Framework Extensions» avant sa sortie. Visual Studio 2015 utilise toujours le nom par défaut.
kert
48

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.

casablanca
la source
15
Il n'y a rien dans ce fichier qui ne fonctionnerait pas sur d'autres plateformes. Cela pourrait ralentir la compilation là-bas, si le compilateur ne prend pas en charge les en-têtes précompilés, mais il ne devrait pas le casser. C'est juste un fichier d'en-tête qui comprend d'autres fichiers d'en-tête.
désaccordé le
2
@detunized: Peut-être que ma réponse donnait un son différent, alors merci d'avoir clarifié cette partie.
casablanca
3

"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

Akash das
la source
-10

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

#include <Windows.h>

au lieu.

Adam H.
la source