# Conditionnel inclus en C

Existe-t-il un moyen de faire une inclusion conditionnelle avec le préprocesseur c?

J’ai une “bibliothèque” d’outils (Tools.c, Tools.h), partagés par différentes équipes. Cette bibliothèque dépend d’une seconde bibliothèque fournissant des fonctionnalités XML. Permet d’appeler ce fichier XML.h Une équipe utilise maintenant une version standard de la deuxième bibliothèque (XML.h), tandis qu’une autre équipe utilise une version étendue (XMLEx.h) dans son projet. La deuxième équipe ne veut pas inclure XML.h car elle a déjà XMLEx.h inclus, fournissant toutes les fonctions de XML.h.

Existe-t-il un mécanisme pour mettre en œuvre quelque chose comme:

#ifdef XML_EX #include "XMLEx.h" #else #include "XML.h" #endif 

uniquement avec le #define XML_EX sur un niveau supérieur (projet)? Comme

 #include "Tools.h" 

pour l’équipe 1 et

 #define XML_EX #include "Tools.h" 

pour l’équipe 2? (Je sais qu’une solution simple ne fonctionnerait pas, mais plutôt pour illustrer le “stream de travail” souhaité.)

Les conditions aux limites sont:

  • Système Windows
  • IDE CVI / LawWindows
  • pas de fichiers make
  • Tools.h devrait comstackr sans projet externe.

EDIT: En ce qui concerne la solution suggérée et l’idée que c’est une méthode courante, cela a peut-être quelque chose à voir avec mon processus de construction, mais cela ne fonctionne pas. L’EDI se plaint de l’absence de XML.h pour l’équipe 2. Je suppose que c’est parce que l’EDI essaie de comstackr chaque source en premier, ne sachant pas que le “externe” est #define.

EDIT: Faisons semblant, l’équipe A est une bande d’idiots, alors que nous ne pouvions appuyer que sur le bouton “RUN” de l’IDE. Par conséquent, il est préférable de travailler hors de la boîte.

EDIT: OK, ça m’a insortinggué. Tout ce que j’ai appris me dit que ça devrait marcher. Voici un ensemble minimal, j’ai testé:

principal c

 #define XML_EX #include "Tools.h" void main(void) { test(); } 

puis Tools.h

 #ifdef XML_EX #include "XMLEx.h" #else #include "XML.h" #endif 

XMLEx.h a la fonction test et XMLEx.c l’implémente. Si j’essaie de construire, j’obtiens un “XML.h not found”. Tout se passe bien avec un #define XML_EX dans le fichier Tools.h.

Vous pouvez avoir un fichier team.h qui définit les macros de l’équipe A et ne les définit pas pour l’équipe B ou définit des valeurs différentes. Chaque équipe aurait alors sa propre copie de team.h.

Chaque membre de l’équipe peut également transmettre cette valeur au compilateur via l’option -D, une macro (au moins, les compilateurs Linux le prennent en charge). Si vous faites cela, je vous recommanderais de passer TEAM_A ou TEAM_B afin de vous donner plus de flexibilité dans le futur et de ne pas avoir à passer plus de macros.

La solution que vous avez suggérée est généralement celle qui est utilisée, et cela se fait assez souvent. Vous pouvez également passer la macro dans le fichier makefile / project.

Notez également que Tools.h est un fichier d’en-tête et sera toujours compilé dans le cadre d’un autre fichier.

Je me suis trompé. Comme indiqué ci-dessus, il n’y a rien de mal avec le code. J’ai mal interprété le message d’erreur de mon IDE.

Pour restr dans l’exemple, j’avais également Tools.c et la compilation de cette source a échoué (naturellement), car je n’avais pas XML.h dans mon projet. Supprimer le code source du projet et lier simplement le lien avec les outils précompilés fonctionne bien.