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 Expert
    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 : 43
    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
    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 chevronné 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
    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 averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    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
    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
    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 averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    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
    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
    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 averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    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 Expert
    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 : 43
    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
    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