2

J'ai un projet composé de plusieurs modules sources et fichiers d'en-tête. Deux d'entre eux (s1.c, s2.c) #include le même fichier d'en-tête (s3.h). Ce fichier d'en-tête contient construction de compilation conditionnelle, basée sur une macro externe définie:Comment mettre en évidence un fichier d'en-tête commun basé sur différents contextes de module source?

#ifdef ExtMacro 
#define IntMacro 1 
#else 
#define IntMacro 2 
#endif 

Maintenant, ExtMacro est défini dans s1.c avant la #include "s3.h", mais pas défini dans s2.c.

Lors de l'ouverture du fichier d'en-tête dans l'éditeur Eclipse, le code est analysé pour la mise en évidence de la syntaxe et les parties exclues de la construction sont surlignées en arrière-plan gris.

Comme vous pouvez le voir, la partie exclue de s3.h dépend du contexte de son inclusion. Mais Eclipse choisit l'un des modules inclus dans le but de mettre en évidence le code d'en-tête.

Existe-t-il un moyen de demander à Eclipse de mettre en évidence le code d'en-tête dans un contexte ou un autre?

+1

C'est un problème lié à l'indexeur. Essayez de déconner avec ses paramètres dans * Project Properties-> C/C++ General-> Indexer *. Mais je ne serais pas optimiste à ce sujet. –

Répondre

0

Vous pouvez définir ExtMacro comme symbole dans les chemins & Symboles. Ensuite, vous créez deux configurations de construction, une où ExtMacro est défini et un où il ne l'est pas. Ensuite, vous définissez l'indexeur à réindexer, lorsque la configuration change. Avec le commutateur de la configuration, l'indexeur affichera le contexte correct.

Ensuite, vous devrez probablement exclure la définition fixe dans s1.c de l'indexeur. L'analyseur Eclipse CDT génère un symbole de préprocesseur que vous pouvez déclencher et utiliser:

#ifdef __CDT_PARSER__ 
#else 
#define ExtMacro 
#endif 

De cette façon, le symbole ExtMacro est caché pour l'analyseur CDT mais pas votre compilateur réel et il ne capte que le symbole de la configuration de construction .

+0

Merci. Idée intéressante, mais le fichier actuel est un code de production issu d'un projet développé par une équipe de programmeurs (et je suis le seul à utiliser Eclipse pour le développement). Je ne possède pas ce module et je n'aimerais pas faire de changement de code. – ysap

+0

@ysap Vous n'avez pas à valider la modification et cela peut fonctionner sans exclure si vous voulez seulement voir le fichier '.h' correctement. –

+0

Mais alors vous devrez répéter le processus chaque fois que vous retirez les modifications, non?(ou, passer par un processus fastidieux de fusion ou plus). – ysap

1

Si vous ajoutez l'en-tête à la liste à Preferences -> C/C++ -> Indexer -> "Index all variants of specific headers", alors CDT indexera les deux versions de l'en-tête.

Lorsque vous ouvrez ensuite l'en-tête en suivant le #include dans s1.c, il vous montrera la version indexée dans le contexte de s1.c. Lorsque vous l'ouvrez en suivant le #include dans s2.c, il vous montrera la version indexée dans le contexte de s2.c.

Je ne connais pas de moyen de contrôler quelle version est affichée lorsque vous ouvrez l'en-tête sans contexte (par exemple via l'Explorateur de projet).

(au lieu d'ajouter l'en-tête à la liste "Index all variants of specific headers", vous pouvez aussi vérifier simplement "Index all header variants". Cependant, je ne recommande pas, car il est susceptible d'avoir un impact négatif de la performance de l'indexation de votre projet.)

+0

Merci. Cela ressemble à la solution au problème, bien que presque deux ans après avoir demandé, je ne me souviens honnêtement pas du contexte de cette question 8-). Je vais essayer de générer un cas de test pour cela dans notre espace de travail, pour approuver la réponse. – ysap