Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1773 connectés 

  FORUM HardWare.fr
  Programmation
  C

  VC++7.1 - vararg macro

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

VC++7.1 - vararg macro

n°1213697
blackgodde​ss
vive le troll !
Posté le 03-10-2005 à 15:44:22  profilanswer
 

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 )-
mood
Publicité
Posté le 03-10-2005 à 15:44:22  profilanswer
 

n°1213714
chrisbk
-
Posté le 03-10-2005 à 15:58:04  profilanswer
 

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
 
 

n°1213715
chrisbk
-
Posté le 03-10-2005 à 15:58:47  profilanswer
 

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

n°1213725
blackgodde​ss
vive le troll !
Posté le 03-10-2005 à 16:06:50  profilanswer
 

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


---------------
-( BlackGoddess )-
n°1213735
chrisbk
-
Posté le 03-10-2005 à 16:13:27  profilanswer
 

par le pointeur retourné par PreLogPrintf

n°1213743
blackgodde​ss
vive le troll !
Posté le 03-10-2005 à 16:16:27  profilanswer
 

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 )-
n°1213955
matafan
Posté le 03-10-2005 à 21:42:03  profilanswer
 

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
n°1213991
Emmanuel D​elahaye
C is a sharp tool
Posté le 03-10-2005 à 22:54:39  profilanswer
 

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/
n°1214127
blackgodde​ss
vive le troll !
Posté le 04-10-2005 à 10:15:06  profilanswer
 

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 )-
n°1214684
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-10-2005 à 16:09:23  profilanswer
 

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/
mood
Publicité
Posté le 04-10-2005 à 16:09:23  profilanswer
 

n°1214690
chrisbk
-
Posté le 04-10-2005 à 16:14:47  profilanswer
 

oui, c'est nulachié

n°1214766
blackgodde​ss
vive le troll !
Posté le 04-10-2005 à 17:26:43  profilanswer
 

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 )-

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  VC++7.1 - vararg macro

 

Sujets relatifs
Macro sous wordSélection et macro avec EXCEL
Une pitite macro toute simple en VBVerrouillage macro excel
Exécution auto d'1 macroN° de ligne de la cellule active d'excel dans une macro
faire cohabiter 2 macro dans un module sous excel??Cherche macro pour incrémenter une chaine nombre dans un texte
[RESOLU] macro,plus de macro...comprend pas tout... (excel)Macro dans Macro
Plus de sujets relatifs à : VC++7.1 - vararg macro


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR