VC++7.1 - vararg macro

VC++7.1 - vararg macro - C - Programmation

Marsh Posté le 03-10-2005 à 15:44:22    

Bonjour,
 
j'aimerais pouvoir définir une macro avec un nombre variable de paramètres, pouvoir écrire quelque chose du style :
 

Code :
  1. #define my_printf(format, <liste d'arguments> ) printf(format, <liste d'arguments> )


 
je tiens absolument au fait que ce soit une macro pour pouvoir incorporer les _FILE_, _LINE_ du préprocesseur
je sais que c'est possible sur d'autres compilateurs comme GCC, mais je ne trouve pas de solutions sur VC++7.1 (VC++ .NET 2003).
 
j'ai vu des choses du style  

Code :
  1. #define my_printf1(format, arg1) printf(format, arg1)
  2. #define my_printf2(format, arg1, arg2) printf(format, arg1, arg2)
  3. #define my_printf3(format, arg1, arg1, arg1) printf(format, arg1, arg2, arg3)


ce que je trouve tres moche
 
ou dans la MFC que je me suis forcé a regarder :
 

Code :
  1. class machin
  2. {
  3.   machin(const char *file, int line);
  4.    void operateur()(const char *format, ...);
  5. };
  6. #define my_machin machin(_FILE_, _LINE_)


mais je fais du C, pas du c++, j'ai pensé ecrire quelque chose comme :

Code :
  1. void machin1(const char *file, int line);
  2. void machin2(const char *format, ...);
  3. #define machin machin1(_FILE_, _LINE_); machin2


mais si on ecrit if(test) machin(pouet pouet); ca foire.
 
je ne trouve pas de solution, je suis un peu perdu, quelqu'un sait s'il est possible d'ecrire une macro vararg avec ce compilateur ? ou sinon comment contourner le problème ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 03-10-2005 à 15:44:22   

Reply

Marsh Posté le 03-10-2005 à 15:58:04    

ouaip, j'avais plus ou moins reussi a contourner le probleme comme ca moi (en gros, de tete)
 

Code :
  1. typedef void (*LogPrintfFunc)(LogNiveau niveau, const char *sFormat,...);
  2. LogPrintfFunc PreLogPrintf(const char *fichier, int ligne, const char *function);
  3. void DoLogPrintf(LogNiveau niveau, const char *sFormat, ...);
  4. #define LogPrintf PreLogPrintf(__FILE__,__LINE__, __FUNCTION__)


 
donc tu appelles  
 

Code :
  1. LogPrint(NIVEAU_PASBON, "aie aie aie : %s apete", moduleErreur)


le preprocesseur transforme ca en :
 

Code :
  1. PreLogPrintf(__FILE__,__LINE__, __FUNCTION__)(NIVEAU_PASBON, "aie aie aie : %s apete", moduleErreur);


 
PreLogPrintf bricole avec file, line, function et renvoie un pointeur de fonction sur la fonction qui traitera le reste (ici, DoLogPrintf)
 
C'est ptet pas super top en multithread, ca necessite ptet un peu de gymnastique mais ca marche
 
 

Reply

Marsh Posté le 03-10-2005 à 15:58:47    

ah merde en fait c'est ptet pas du tout ske tu veux [:pingouino]

Reply

Marsh Posté le 03-10-2005 à 16:06:50    

je comprends pas trop dans ton exemple comment est appelée ensuite une fonction de type LogPrintfFunc ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 03-10-2005 à 16:13:27    

par le pointeur retourné par PreLogPrintf

Reply

Marsh Posté le 03-10-2005 à 16:16:27    

oulala ok j'avais pas vu :p
 
belle ruse qui vaut bien la surcharge de l'operateur ()
 
merci beaucoup, c'est tout à fait ce que je cherchais :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 03-10-2005 à 21:42:03    

Bon j'ai pas lu le truc de chrisbk, mais il me semble que ce que tu veux c'est les "variadic marcos". Par exemple :

Code :
  1. #include <errno.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #define myname "toto"
  5. #define PERRORV(format, ...) printf("%s: " format ": %s\n", myname, ## __VA_ARGS__, strerror(errno))
  6. int
  7. main()
  8. {
  9.         PERRORV("getpid()" );
  10.         PERRORV("open(%s)", "file" );
  11.         PERRORV("kill(%d, %d)", 12345, 9);
  12.         return 0;
  13. }


Par contre ce n'est pas supporte par tous les compilateurs.
 
Edit : voir aussi http://developer.apple.com/documen [...] acros.html

Message cité 2 fois
Message édité par matafan le 03-10-2005 à 21:46:41
Reply

Marsh Posté le 03-10-2005 à 22:54:39    

matafan a écrit :


Code :
  1. #define PERRORV(format, ...) printf("%s: " format ": %s\n", myname, ## __VA_ARGS__, strerror(errno))


Par contre ce n'est pas supporte par tous les compilateurs.

C99 only.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 04-10-2005 à 10:15:06    

matafan a écrit :

Code :
  1. #define PERRORV(format, ...) printf("%s: " format ": %s\n", myname, ## __VA_ARGS__, strerror(errno))




 
marche pas sur vc++ 7.1 :(


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 04-10-2005 à 16:09:23    

blackgoddess a écrit :

marche pas sur vc++ 7.1 :(


Ben oui, VC++ 7.1 n'est pas C99.  
 
http://msdn.microsoft.com/chats/tr [...] 22703.aspx
 
dans 10 ans, peut être...
 
As-tu une bonne raison de ne pas utiliser gcc (Dev-C++, par exemple)


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 04-10-2005 à 16:09:23   

Reply

Marsh Posté le 04-10-2005 à 16:14:47    

oui, c'est nulachié

Reply

Marsh Posté le 04-10-2005 à 17:26:43    

j'etudierais le truc pour voir si en effet j'ai de bonnes raisons
j'en vois deja qq raisons (bonnes, pas vraiment) :  
 - je connais tres mal l'ide
 - je sais pas si ya possibilité d'utiliser un controle de code source avec (c'est un projet en equipe)
 
edit :
ca m'embeterait de changer d'environnement de développement juste pour un problème comme ca, après il faut voir si d'autres problèmes du style peuvent survenir


Message édité par blackgoddess le 04-10-2005 à 17:28:03

---------------
-( BlackGoddess )-
Reply

Sujets relatifs:

Leave a Replay

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