web-dev-qa-db-fra.com

A quoi sert "stdafx.h" dans Visual Studio?

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

À quoi sert stdafx.h? Est-ce que je peux simplement supprimer ce fichier d'en-tête?

480
prosseek

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

La compilation des en-têtes inclus au-dessus des fichiers C++ est un très processus 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 très , très long processus lent . Avoir à le refaire encore et encore pour chaque fichier source Cpp est un glas.

Ceci n'est pas propre à Windows, mais constitue un problème ancien auquel doivent faire face tous les compilateurs qui doivent compiler avec une API de grande taille telle que Windows.

Le compilateur Microsoft peut améliorer ce problème avec une astuce simple appelée en-têtes précompilés . Le truc est assez astucieux: même si chaque fichier CPP peut 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 exemple, avoir des macros différentes # définies avant les inclus, ou en incluant les en-têtes dans un ordre différent), ce 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 compilés dans votre application.

Le compilateur peut faire d’énormes gains de temps s’il n’est pas obligé de commencer à compiler chaque fichier Cpp plus ses dizaines d’inclusions littéralement à partir de rien à 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, appelé fichier "en-tête précompilé", qui est généralement un fichier nommé stdafx.h simplement pour des raisons historiques.

Il vous suffit de lister tous vos grands en-têtes énormes pour vos API dans votre fichier stdafx.h, dans l’ordre approprié, puis de lancer chacun de vos fichiers CPP tout en haut avec un #include "stdafx.h", avant tout contenu significatif (à peu près le la seule chose autorisée avant est les commentaires).

Dans ces conditions, au lieu de commencer à partir de zéro , 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 soit propre aux compilateurs Microsoft, pas plus que je pensais qu'il s'agissait d'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 destiné au compilateur: /Yu "stdafx.h". Comme vous pouvez l'imaginer, l'utilisation du nom de fichier stdafx.h 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 en cliquant avec le bouton droit de la souris sur un projet CPP, en sélectionnant "Propriétés" et en sélectionnant "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 si vous exécutez votre projet à l'aide d'un outil qui ne les prend pas en charge), votre programme ne sera pas 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.

798
Euro Micelli

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 suivantes. Vous pouvez en savoir plus à ce sujet ici sur MSDN .

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

44
casablanca

"Stdafx.h" est un en-tête précompilé. Il inclut un fichier pour les fichiers d'inclusion système standard et pour les fichiers d'inclusion spécifiques à un projet fréquemment utilisés mais modifiés peu fréquemment, ce qui réduit le temps de compilation et le traitement inutile.

L'en-tête précompilé stdafx.h est essentiellement utilisé dans Microsoft Visual Studio pour informer le compilateur des fichiers une fois compilés, sans qu'il soit nécessaire de les compiler à partir de rien. Vous pouvez en lire plus à ce sujet

http://www.cplusplus.com/articles/1TUq5Di1/

https://docs.Microsoft.com/en-us/cpp/ide/precompiled-header-files?view=vs-2017

2
Akash das