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 :

Macro qui définit une macro?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Par défaut Macro qui définit une macro?
    Bonjour,

    Pour mon projet, j'utilise un système de trace très simple qui est défini via une macro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define TRACE(X) do{ printf("[nom du module] "); (X);} while(0)
    Par flemme, j'ai pas envie de réécrire ca à chaque fois dans chaque module. Ce que j'aimerais, c'est avoir une macro qui me définit cette macro (fiou)!

    Du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define DEFTRACE(A) #define TRACE(X) do{printf((A)); (X);}while(0)
    Que j'utiliserais ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DEFTRACE("Nom du module ")
    Le problème (haha) c'est la présence du #, évidemment. J'obtiens une erreur: `#' operator should be followed by a macro argument name

    Comme mon compilo est pour l'embarqué, je ne peux pas utiliser des macro à nombre d'arguments variable.

    Savez vous si c'est possible (sans forcément entrer dans le débat: fais une fonction à la place) de définir une macro dans une autre macro?


    Merci d'avance!

  2. #2
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Par défaut
    La première macro fonctionne ??

    Le while(0) me parait un peut flou (puisque la condition sera fausse donc il va sortir tout de suite... bref...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define DEFTRACE(A) #define TRACE(X) do{printf((A)); (X);}while(0)
    Ne peut pas fonctionner, tu ne peux pas faire deux #blabla sur une même ligne.

    Il faudrait que tu fasse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define DEFTRACE(X, TEXT) do{printf((TEXT)); (X);}while(0)

    Mais il me semble qu'il y ai un système particulier pour l'utilisation de texte dans une macro.
    Dans tous les cas ta première macro "TRACE" ne prend qu'un "paramètre" elle ne peut donc pas accueillir une variable X et une variable de TEXTE à mettre dans le printf.

    Cela étant dit les macros ne sont pas mon fort...
    J'espère que quelqu'un d'autre pourra mieux t'aider que moi, ou tout du moins mieux t'indexer vers une autre solution.

    Bonne chance

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par rilou Voir le message
    Le while(0) me parait un peut flou (puisque la condition sera fausse donc il va sortir tout de suite... bref...
    C'est la technique classique pour faire des macros multiinstructions

    Pour la question, bein il suffit de modifier la macro pour qu'elle prenne le texte en paramètre, comme l'a montré rilou.

    A part ça, le premier argument de printf est une chaine de format et non une chaine à afficher, gardez ça en tete

  4. #4
    Membre confirmé Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Par défaut
    Pour l'instant, j'utilise TRACE tout court, ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define TRACE(X) do{ printf("[Mon Module] "); (X);} while(0) 
    //....
    TRACE(printf("Mon log\n"));
    Affiche dans la console:
    [Mon Module] Mon Log
    En suivant votre idée donc, il faudrait que je fasse quoi?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define TRACE(X,Y) do{ printf((X)); (Y);} while(0) 
    #define DEFTRACE(X) TRACE("MonNomDeModule",(X))
    ?

  5. #5
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Oui, par exemple

    Au fait, vous avez les constantes symboliques standards __FILE__ et __LINE__ si vous voulez vous passer d'indiquer le module (si c'est ça que vous vouelz faire)

  6. #6
    Membre confirmé Avatar de Gui13
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 157
    Par défaut
    Oui je connais déjà __FILE__ et __LINE__, j'ai fait une macro dédiée à ceux là.

    Mais comme mon makefile va chercher ces fichiers dans une arborescence (modules/nomDuModule/src/fichier.c), ca rend rapidement les logs illisibles (puisque __FILE__ inclus le chemin "modules/nomDuModule/src/").

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

Discussions similaires

  1. [WD-2002] Macro qui modifie une macro
    Par Wanaka dans le forum VBA Word
    Réponses: 2
    Dernier message: 09/05/2009, 10h46
  2. Macro qui crée une macro
    Par ankoubzh dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/05/2009, 19h44
  3. Macro qui lance une macro
    Par Lameth dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 19/11/2008, 15h23
  4. Une macro qui supprime les macros ?
    Par GodOfTrolls dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/06/2008, 10h03
  5. macro qui crée une macro, est ce possible ?
    Par Djohn dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/07/2007, 09h43

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