2009-08-24 7 views
5

Si je mets un en-tête (ah) dans stdafx.h et que l'en-tête inclut un autre en-tête (bh) qui n'est pas mentionné dans stdafx.h, bh sera visité chaque fois que quelqu'un comprend ah ou est-il compilé dans le cadre de ah? Si elle est compilée dans a.h, que se passe-t-il quand quelqu'un inclut b.h directement? Est-ce que cela sera précompilé ou non?Question sur les en-têtes précompilés dans Visual C++

Ma motivation pour poser cette question est que j'essaie d'optimiser le contenu des fichiers stdafx.h pour le logiciel sur lequel je travaille. La reconstruction et les temps de construction incrémentiels sont importants pour nous. Je me demandais si je pouvais simplement faire une recherche parmi tous les fichiers .cpp pour les directives #include et compter le nombre de fois que chaque fichier est inclus. Les fichiers souvent inclus peuvent être de bons candidats pour le fichier stdafx.h. Bien sûr, cette stratégie est complètement bidon si je dois considérer non seulement quels sont les fichiers inclus, mais aussi quels sont les fichiers inclus.

Je doute compte, mais nous utilisons Visual Studio 2005.

+0

S'IL VOUS PLAÎT VOTE POUR CE: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4931119-allow-precompiled-headers-to-be-shared-between-pro –

Répondre

4

a.h et b.h fera partie d'en-tête précompilé, et il n'y a pas besoin de les inclure plus tard. Tout ce dont vous avez besoin est d'inclure stdafx.h où a.h ou b.h sont requis. Si vous incluez ah ou bh explicitement après stdafx.h (tout le code avant stdafx.h include est ignoré), alors il ne sera pas compilé une deuxième fois (juste parce qu'il est généralement protégé par la directive #pragma once ou définit), mais le compilateur D'ailleurs, vous devriez savoir que vous pouvez utiliser plusieurs fichiers d'en-tête précompilés (mais pas plus d'un dans chaque fichier cpp).

+3

Ce que vous dites à propos de y compris ah ou bh après stdafx.h est techniquement vrai - le compilateur regardera à nouveau les en-têtes - mais la plupart des en-têtes utilisent #pragma une fois ou incluent des gardes pour empêcher que cela se produise. En fait, je recommande d'inclure a.h et b.h partout où ils sont nécessaires même si a.h est dans stdafx.h - sinon vous ne serez pas capable de modifier le contenu de stdafx.h plus tard sans courir dans une liste interminable d'erreurs de compilation. –

+0

Oui, ils ne seront pas compilés, mais ils seront ouverts par le compilateur techniquement. –

+1

Je suis d'accord L'idée de Nick est utile, mais j'ai juste peur qu'il y ait un problème de performance car nous devons faire des E/S disque supplémentaires pour trouver un #progma une fois –