web-dev-qa-db-fra.com

stdafx.h: Quand en ai-je besoin?

Je vois tellement de code, y compris stdafx.h. Dites, je pas veux des en-têtes pré-compilés. Et je (volonté} _ inclut manuellement tous les en-têtes système requis. Dans ce cas, y a-t-il une autre bonne raison pour laquelle je devrais savoir où j'ai besoin de stdafx.h?

30
Ashwin Nanjappa

Si vous ne souhaitez pas utiliser les en-têtes précompilés, il est inutile d'utiliser un fichier d'inclusion standard. Cela ralentira la construction de chaque fichier qui l'inclut et les fera inclure des éléments supplémentaires dont ils n'ont pas besoin. Débarrassez-vous de lui et incluez simplement les en-têtes dont ils ont besoin.

17
1800 INFORMATION

Même sans en-têtes pré-compilés, stdafx.h peut être pratique car il regroupe les en-têtes et les définitions communs à tous les fichiers.

Vous pouvez bien sûr choisir de répéter toutes ces définitions dans chaque fichier. stdafx.h n'est pas strictement nécessaire.

2
kgiannakakis

stdafx.h est juste un autre fichier d'en-tête. Si vous êtes tombé, vous n'en avez pas besoin. N'hésitez pas à ne pas l'inclure et à le retirer du projet.

Cependant, il est assez typique d'avoir un fichier comme stdafx.h pour que les en-têtes précompilés fonctionnent et pour ne pas inclure tous les éléments manuellement dans chaque fichier source.

2
sharptooth

Vous pouvez utiliser des en-têtes pré-compilés (ce qui est une bonne chose) sans utiliser stdafx.h (je l'abomine aussi). Je n'ai accès qu'à VC++ 6.0, mais dans celui-ci, allez dans Paramètres du projet | C/C++ | En-têtes précompilés et sélectionnez "Utilisation automatique de l'en-tête précompilé" mais laissez la zone "Compilé via" vide.

2
anon

Comme d'autres l'ont mentionné: si vous n'avez pas besoin d'en-têtes précompilés, vous n'avez pas vraiment besoin de stdafx.h. Et l’utiliser simplement pour grouper des inclusions communes est en fait une très mauvaise pratique.

En fait, même lorsque vous utilisez des en-têtes précompilés, il est judicieux d'inclure les en-têtes dont votre processus a réellement besoin après stdafx.h (ou precompiled.h ou ce que vous souhaitez appeler), ainsi que #ifdef magic dans votre en-tête précompilé pour désactiver l'utilisation de PCH.

Pourquoi? Afin de vérifier vos dépendances de module. Etre capable de désactiver votre PCH vous permet de savoir si vous incluez ou non les modules nécessaires, et vous pouvez ensuite écrire un outil pour vérifier les interdépendances de vos modules en analysant vos fichiers .cpp et .h (en excluant l'en-tête PCH, bien sûr).

1
snemarch

Je sais que c'est un vieux fil, mais je pensais transmettre mon opinion aux lecteurs. J'ai trouvé cela en 2017, alors je suis sûr que je ne suis pas le seul à être ici. 

L’utilisation d’en-têtes pré-compilés présente un avantage qui peut être négligé par d’autres parce qu’ils utilisent leur pratique depuis de nombreuses années. La norme C++ a beaucoup évolué. Au lieu d'inclure vector dans 20 fichiers dont vous pourriez avoir besoin et ou autre, vous utilisez un fichier PCH et le compilateur doit faire moins de travail, ce qui rend les visages joyeux pour tout le monde. Vous pouvez également y insérer vos macros courantes, telles que VERIFY, ASSERT et les objets de classe intelligents. Ne mettez pas les en-têtes de classe, cela n’aurait aucun sens, mais plutôt la bibliothèque standard ou quelque chose que vous devrez utiliser de manière globale dans de nombreux endroits, tels que les macros que j’ai mentionnées. 

en gros, réalisez-le en incluant les en-têtes dont vous avez besoin dans chaque fichier, tels que iostream, chaîne et vecteur, vous compilez efficacement chaque fois sous la forme d'un inline dans le fichier. Incluez un en-tête "pré-compilé", eh bien, le nom devrait sonner ici. 

0
Gary Stewart