2009-08-25 10 views
4

Le préprocesseur peut-il détecter si le code de l'unité de traduction utilise (ou crée) des en-têtes précompilés? Le vrai problème auquel je suis confronté en ce moment est que je suis sur un projet qui est abusant de PCH en précompilant pratiquement tous les fichiers d'en-tête.
Cela signifie qu'il n'y a pas de la gestion des dépendances claires que vous pouvez obtenir de #includes et les temps de compilation sont terribles. Pratiquement chaque changement déclenchera une reconstruction complète.
L'application est bien trop grosse pour la réparer en une seule fois, et certains anciens refusent de croire que la précompilation est mauvaise en aucune façon. Je vais devoir le prouver en premier.
Je dois donc le faire étape par étape et m'assurer que mes modifications n'affectent pas le code qui est compilé à l'ancienne façon PCH.
Mon plan est de faire ifdef out le PCH.h et de travailler sur la version non PCH chaque fois que j'ai du temps à perdre.Détection d'en-têtes précompilés

#ifdef USES_PCH 
#include "PCH.h" 
#elif 
// include only whats needed 
#endif 

Je souhaite éviter de définir USES_PCH à la ligne de commande et de maintenir manuellement en synchronisation avec /Y qui, en plus de ne pas être très élégante, serait une douleur. Il y a beaucoup de configurations et de modules à jongler avec et beaucoup de fichiers qui ne respectent pas les valeurs par défaut du projet.

+0

Certes, le préprocesseur sait déjà si elle est censé être générer ou en utilisant les en-têtes précompilés. Il n'a pas besoin de * détecter * rien. Avez-vous plutôt voulu demander si le * code en cours de traitement * pouvait le détecter, comme avec une commande 'ifdef'? –

+0

Oui, je veux faire un #ifdef __USES_PCH ou quelque chose de similaire – grimner

+0

Quel est le problème réel que vous voulez résoudre avec cela? – peterchen

Répondre

1

Pour autant que je sache, il ne peut pas, mais il y a des heuristiques: VC++ utilise StdAfx.h, Borland utilise #pragma hdrstop, etc.

+0

VC++ utilise uniquement StdAfx.h si vous travaillez avec les paramètres de projet par défaut, vous pouvez le modifier à tout moment. –

+0

Pour ma part, je le change en quelque chose d'unique pour chaque vcproj, mais je m'attends à ce que beaucoup de projets soient juste avec les valeurs par défaut. – rpg

3

Si Visual C++ défini une constante pour indiquer si les en-têtes précompilés étaient en cours d'utilisation, il serait probablement répertorié dans Predefined Macros. Et ce n'est pas documenté là-bas, donc ça n'existe probablement pas. (S'il existe, il est probablement non documenté et peut changer dans une future version.)

+0

Oui, je sais que ce n'est pas une macro officielle. S'il y en avait un, je n'aurais pas à demander ici. J'espérais que quelqu'un connaissait une façon indirecte de le comprendre de toute façon. – grimner

3

Cela ne fonctionnera pas, lorsque vous utilisez des en-têtes précompilés dans Visual C++, vous ne pouvez même pas avoir de code avant d'inclure un en-tête précompilé. J'essayais de faire quelque chose de similaire, quand je suis tombé sur votre question. Après un peu d'essai et d'erreur, j'ai trouvé qu'il ne peut y avoir aucun code avant la directive #include pour l'en-tête précompilé lors de l'utilisation de l'option du compilateur/Yu.

#ifdef USES_PCH 
#include "stdafx.h" 
#endif 

Résultat: C1020 erreur fatale: endif inattendue

+0

J'étais sur le point d'essayer ça bien avant ça :) thx – n00b

+0

Je pense que #ifdef avant l'en-tête précompilé fonctionne dans VS2015. – ShitalShah

+0

@ShitalShah, cela ne fonctionne pas pour moi dans VS2015. Le code ci-dessus produit toujours une erreur C1020 lorsque le fichier est défini pour utiliser une option PCH (/ Yu). – Matthew