[C/C++] controller le preprocesseur

controller le preprocesseur [C/C++] - C - Programmation

Marsh Posté le 29-08-2008 à 17:16:23    

Salut a tous
 
J'aimerai bien pouvoir appeler un preprocesseur avec les ifdef que je veux et recuperer le fichier source. L'idee c'est que le code original marche et que je puisse virer des parties du code avant de le donner a quelqu'un d'autre.
 
exemple: transformer
 

Code :
  1. #include<bla>
  2. code1
  3. #ifndef SYMB
  4. code2
  5. #endif


 
en ce code ci quand on definit SYMB
 

Code :
  1. #include<bla>
  2. code1


 
notons que ceci n'est pas le comportement de gcc -E -DSYMB qui appliquerait le include comme un gros bourrin et me rendrait un code tout moche et completement illisible
 
toute initiative a base de text processing est exclue parce que les ifdef peuvent etre compliques genre #if defined(BLAH)||defined(CHOMBIER)
 
toute vos idees sont bienvenues
 
Merci d'avance
 
edit: j'avais inverse ifdef et ifndef


Message édité par Cytoplasm le 29-08-2008 à 18:03:19
Reply

Marsh Posté le 29-08-2008 à 17:16:23   

Reply

Marsh Posté le 29-08-2008 à 17:48:57    

Tu es sur du resultat que tu desires, j'ai l'impression que tu as inverse une condition.
 
Et qu'est-ce qui doit se passer si SYMB est par une directive #define dans le fichier (ou meme, dans un fichier inclu)?
 
J'ai l'impression que tu es bon pour reimplementer un preprocesseur qui fait ce que tu veux; si c'est suffisemment restreint, ca peut etre relativement petit.

Reply

Marsh Posté le 29-08-2008 à 18:01:39    

Ha ouais, je suis con, j'ai inverse #ifdef et ifndef. :)
 
SYMB est toujours defini par moi (et pas dans le fichier ni dans un include)
 
je me demandais si il y avait pas moyen d'utiliser m4

Reply

Marsh Posté le 01-09-2008 à 11:33:59    

M4 je ne pense pas, ce n'est pas du tout fait pour ça.

Reply

Marsh Posté le 01-09-2008 à 12:40:51    

la de tête à part faire un truc à la main :'( je vois pas de soluce.
J'ai exactement la même problématique pr un de mes projets, et j'ai donc pris cette route.

Reply

Marsh Posté le 01-09-2008 à 13:52:23    

Ca ne m'etonnerait pas que ce soit deja disponible (bien que mes recherche n'ait rien trouve, j'avais le vague souvenir d'avoir vu quelque chose qui faisait cela).  Des outils comme emacs, doxygen, ... ont cette possibilite, mais pas a ma connaissance celle de sauver le resultat.
 
En passant, avec les limitations que Cytoplasm donne:
   - uniquement les symboles definis sur la ligne de commande
   - uniquement des #if avec des expressions testant defined()
ce ne doit pas etre trop complique a faire.

Reply

Marsh Posté le 01-09-2008 à 16:38:46    

J'ai regarde m4, c'est carrement mais alors carrement pas fait pour ca...
 
Toutes mes recherches sur le net n'ont rien donne! Pourtant, ca m'a l'air super standard de vouloir vendre une partie de son code et garder une autre partie...
 
Bon, et puis j'accorde que c'est pas super dramatique de le faire a la main, mais ca me saoule completement! entre autre joyeusete, il faut gerer les trucs comme #if BLAH || defined(SYMB)
bouh bouh ;-(

Reply

Marsh Posté le 01-09-2008 à 21:47:50    

Une idée comme ça : tu peux peut-être faire un gcc -E, un gcc -E -DSYMB, comparer les résultats, et injecter les différences dans ton source ? Le problème c'est de savoir où injecter chaque différence.

Reply

Marsh Posté le 01-09-2008 à 22:35:51    

pp doit mettre des trucs genre #line là ou il à modifier le contenu.

Reply

Marsh Posté le 01-09-2008 à 22:48:15    

je suis pas sur que ca marche de faire le diff pour la raison suivante:
supposons que j'ai un #if (!defined(SYMB) || defined(BLAH))  
donc ce que j'aimerais c'est que ca soit transforme en #if defined(BLAH) et ca je vois vraiment pas comment je vais le recuperer depuis le diff etant donne que le prepro va toujours evaluer defined(BLAH)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed