Qu'est-ce que "stdafx.h " utilisé dans Visual Studio?

un fichier nommé stdafx.h est généré automatiquement lorsque je lance un projet dans Visual Studio 2010. J'ai besoin de créer une bibliothèque C++ multiplateformes, donc je ne peux pas utiliser ce fichier d'en-tête.

dans quel cas stdafx.h est-il utilisé? Est-ce que je peux supprimer ce fichier d'en-tête?

444
demandé sur Steven Vascellaro 2011-01-18 19:00:30

3 réponses

tous les compilateurs C++ ont un problème de performance sérieux à traiter. Compiler du code c++ est un processus long et lent.

compiler des en-têtes inclus sur les fichiers C++ est un très processus long et lent. Compiler les énormes structures d'en-tête qui font partie de L'API de Windows et d'autres grandes bibliothèques API est un très , très long, processus lent. De devoir le faire encore, et encore, et encore pour chaque seul Rpc fichier source 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 un tour simple appelé headers précompilés . L'astuce est assez habile: 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 en plus de chaque fichier Cpp (par des choses comme avoir des macros différentes #définies à l'avance des includes, 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 douzaines ou des centaines de fichiers inclus, mais ils ont tous la même signification pour tous les fichiers du RPC compilés dans votre demande.

le compilateur peut faire d'énormes économies de temps s'il ne doit pas commencer à compiler chaque fichier Cpp plus ses douzaines de comprend littéralement de zéro à chaque fois.

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

il vous suffit d'énumérer tous vos grands headers énormes pour votre APIs dans votre stdafx.h fichier, dans l'ordre approprié, puis démarrer chacun de vos fichiers RPC à la très haut avec un #include "stdafx.h" , avant tout contenu significatif (à peu près la seule chose permise 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 compiler tout dans stdafx.h .

Je ne crois pas que cette astuce soit unique aux compilateurs Microsoft, et je ne pense pas non plus qu'il s'agisse d'un développement original.

pour Microsoft compilers, le paramètre qui contrôle l'utilisation des en-têtes précompilés est contrôlé par un argument en ligne de commande du compilateur: /Yu "stdafx.h" . Comme vous pouvez l'imaginer, l'utilisation de la stdafx.h nom du fichier est simplement une convention; vous pouvez modifier 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++\Headers 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 des en-têtes précompilés (ou exécutez votre projet à travers un outil qui ne les supporte pas), 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 de Windows, vous pouvez facilement Commenter ou supprimer #includes à partir du stdafx.h fichier. Y n'est pas nécessaire de supprimer le fichier en soi, mais il est clair que vous pouvez le faire aussi, en désactivant le paramètre d'en-tête précompile ci-dessus.

751
répondu Euro Micelli 2018-01-15 11:13:21

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 lire plus à propos de it ici sur MSDN .

si vous construisez une application multiplateformes, cochez" projet vide " lors de la création de votre projet et Visual Studio ne mettra aucun fichier dans votre projet.

40
répondu casablanca 2011-01-18 16:03:47

je viens de tomber sur ce moi-même depuis que j'essaie de créer moi-même un cadre bare bones mais a commencé par créer une nouvelle option de programme Win32 dans Visual Studio 2017. "stdafx.h " n'est pas nécessaire et doit être supprimé. Ensuite, vous pouvez enlever le stupide " stdafx.h " et " stdafx.rpc" qui est dans votre Explorateur de solutions ainsi que les fichiers de votre projet. À sa place, vous devrez mettre

#include <Windows.h>

à la place.

-1
répondu Adam H. 2018-03-19 07:53:02