IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Paramètres variables dans une macro


Sujet :

C

  1. #1
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut Paramètres variables dans une macro
    Bonjour à tous,

    Je voudrais savoir s'il est possible de placer des paramètres variables dans une macro.

    Je m'explique : je voudrais faire une librairie de journalisation dans laquelle en appelant la fonction logger_debug, on obtienne quelque chose du genre:
    DEBUG 18/01/2008 - 15:22:32 - mainc.c:32 - Un message de debug
    Comme vous le voyez, je voudrais le nom du fichier ainsi que le numéro de ligne où la fonction a été appelée.

    J'ai donc fait une fonction ayant ce prototype:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void logger_debug(LOGGER *logger, const char *source_file, const int line,
                      const char *format, ...);
    Les variables source_file et int line sont toujours renseignées grace aux macros __FILE__ et __LINE__. Ce qui me donne donc dans mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	logger_debug(logger, __FILE__, __LINE__, "%s", "Un message de debug");
    	logger_debug(logger, __FILE__, __LINE__, "%s", "Un autre message de debug");
    J'aurais voulu simplifier l'appel de la fonction en créant une macro, ce qui me permettrait d'écrire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LOG_DEBUG(logger, "%s", "Un message de debug")
    Malheureusement, le problème est que le nombre de paramètres de la fonction est variable, et la macro définie ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define LOG_DEBUG(logger, format, ...) logger_debug(logger, __FILE__, __LINE__, format, ...)
    ne compile pas.

    Comment puis-je résoudre ce problème?

  2. #2
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define LOG_DEBUG(logger, format, ...) logger_debug(logger, __FILE__, __LINE__, format, ...)
    sera de la forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define LOG_DEBUG(logger, format, ...) logger_debug(logger, __FILE__, __LINE__, format, ##args)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    Petite correction :

    En fait je ne savais pas que l'on pouvait donner un nombre de paramètres variable à une macro, j'ai donc essayé d'écrire ma propre macro en suivant cet exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define LOG_DEBUG(logger, format, ...) logger_debug(logger, __FILE__, __LINE__, format, ##args)
    Mais visiblement ça ne compile pas, cependant étant donné que google est un de mes grands amis j'ai trouvé autre chose qui marche super bien ^^
    je vous file la macro que j'ai composé (toute critique serait la bienvenue) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* cette directive de compilation permet d'exprimer ou non les informations relatives à des erreur d'execution */
    /* REMARQUE : macro à nombre de paramètres variable (la classe ^^) */
    #ifdef DEBUG
    #define DEBUG_INFO(...)							\
      {									\
        printf("==> AT %s() IN %s, L%d : ",__FUNCTION__, __FILE__, __LINE__); \
        printf(__VA_ARGS__), putchar('\n');					\
      }									\
       #else 
    #define DEBUG_INFO(...)
    #endif
    pour vous le prouver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      #include <stdio.h>
    #include <stdlib.h>
     
    #include "mesMacros.h"
     
    int main(void) {
      DEBUG_INFO("Le Pré processeur c'est %s %s %c%c%c", "super", "cool", ':', ')', '\n');
      DEBUG_INFO("Tous sur http://www.%s.net","developpez");
      return EXIT_SUCCESS;
    }
    Résultats :
    [mat@localhost labo$ ./exe
    ==> AT main() IN test-.c, L7 : Le Préprocesseur c'est super cool

    ==> AT main() IN test-.c, L8 : Tous sur http://www.developpez.net
    attention quand même, si vous compilez avec '-pedantic' :
    [mat@localhost labo]$ gcc -o exe -ansi -pedantic -DDEBUG test.c
    mesMacros.h:33:20: attention : les macros anonymes à nombre variable d'arguments ont été introduites avec le C99

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par muad'dib Voir le message
    Je voudrais savoir s'il est possible de placer des paramètres variables dans une macro.
    Une astuce bien connue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define PRINTF(a) printf a
    Ca s'utilise comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PRINTF(("%s\n", "Hello world"));
    Ca permet d'activer ou non des traces dans le code à la demande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #define DBG 1 /* 0 | 1 */
     
    <...>
     
    #if DBG
    #define PRINTF(a) printf a
    #else
    #define PRINTF(a)
    #endif
     
    <...>
     
        PRINTF(("%s\n", "Hello world"));
     
    <...>
    Après, l'imagination est au pouvoir... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    #include <stdio.h>
     
    /* 0 | 1 */
    #define DBG 1
     
    #if DBG
    #define PRINTF(a) printf a
    #else
    #define PRINTF(a)
    #endif
     
     
    #define LOG(a)\
       PRINTF (("'%s' at %s:%d\n", a, __FILE__, __LINE__))
     
     
    int main (void)
    {
       char const *s = "Hello world";
     
       printf ("%s\n", s);
       PRINTF (("'%s' at %s:%d\n", s, __FILE__, __LINE__));
       LOG(s);
     
       return 0;
    }

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    oui très bien cette astuce,
    et j'ajouterai pour les gros flémard, un makefile du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    DEBUG=
    MODULES=main.o #ici vous pouvez mettre d'autres modules...
    OPTIONS=-Wall -ansi -O3
     
    exe: $(MODULES)
            gcc $(DEBUG) $(OPTIONS) -Wall -O3 -o exe $(MODULES)
     
    main.o: main.c 
            gcc $(DEBUG) $(OPTIONS) -c main.c
     
    debug:  clean
            make DEBUG='-DDEBUG -g'
     
    release: clean exe
     
    clean:

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mathieubo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DEBUG=
    MODULES=main.o #ici vous pouvez mettre d'autres modules...
    Je recommande de ne jamais rien mettre autre chose qu'une fin de ligne après une commande de makefile..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DEBUG=
    # apres, vous pouvez mettre d'autres modules...
    MODULES=main.o

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    oui, tu as certainement raison, mais ici c'était juste pour les besoins de l'exemple ^^

    à vrai dire, j'ai jamais essayé...

  8. #8
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Déclaration de variable dans une macro
    Par olivier_u dans le forum C
    Réponses: 8
    Dernier message: 26/04/2013, 13h55
  2. Macro Variable dans une Macro
    Par Julia333 dans le forum Macro
    Réponses: 5
    Dernier message: 04/04/2012, 20h58
  3. Réponses: 2
    Dernier message: 26/01/2012, 16h24
  4. Récupérer nom d'une variable dans une macro
    Par Filippo dans le forum Macro
    Réponses: 2
    Dernier message: 01/10/2009, 12h26
  5. Variable dans une macro
    Par euskal75 dans le forum IHM
    Réponses: 2
    Dernier message: 05/12/2007, 17h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo