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 :

Des macros qui générent des macros


Sujet :

C

  1. #1
    Membre habitué Avatar de the-destroyer
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 204
    Points : 125
    Points
    125
    Par défaut Des macros qui générent des macros
    Bonjour,

    Je planche actuellement sur un petit problème.
    Si une macro définie une autre macro le préprocesseur la remplace.

    #define _MACRO_1_ hello
    #define _MACRO_2_ _MACRO_1_

    _MACRO_2_

    Alors gcc -E renvoie entre autre hello.
    Là je pense avoir pigé.

    Si je ne me trompe pas, j'ai vérifié sur la doc de gcc, le prépocesseur parse le code temps qu'il y a des macros et les remplace par leurs valeurs.

    Maintenant, j'essai de définir des conditions dans un header :

    #define _IFNDEF_#ifndef
    #define _DEFINE_ #define
    #define _ENDIF_ endif

    #define _SURVEY_(name) _IFNDEF_ _##name##_SURVEY_ \
    _DEFINE_ _##name##_SURVEY_ \
    _ENDIF_

    Dans un autre header je fais :
    _SURVEY_(NODE)

    Lorsque je fais gcc -E j'ai :
    #ifndef _NODE_SURVEY_#define _NODE_SURVEY_ #endif
    C'est bien ce que je voudrai qu'il fasse sauf qu'il ne le fais pas en entier.

    Si je compile le fichier en .c s'y rattachant j'ai :
    Error : stray # in program

    Si je remplace _IFNDEF_ par #ifndef gcc -E me renvoie l'erreur:
    # is not followed by a macroparameter

    Ce que je fais ici est un peu bizarre.
    Alors j'explique l'objectif.
    J'écrit un module de surveillance active de bugs et de run pour d'autres petits modules.
    Ce module doit permettre d'écrire ce qui se passe dans d'autre modules dans des fichiers choisis.
    Mais, je veux pas me taper la définition dans tous les fichiers du type:
    #ifndef _NODE_ERRORS_
    #define _NODE_ERRORS_
    #ifndef _NODE_ERRORS_OUTPUT_
    #define _NODE_ERRORS_OUTPUT_ stderr
    #endif
    #define NODE_ERRORS(x)
    #else
    #define NODE_ERRORS(x) (fprintf(_NODE_ERRORS_OUTPUT_, "%s in %s line %s\n", x, __FILE__, __LINE__))
    #endif

    L'appel à <module>_ERRORS(explication de l'erreur) dans chaque module permettrai de suivre son fonctionnement et de surveiller leur activité pour des versions alpha par des tiers.
    De tels fichiers pourrai ensuite m'être envoyé afin que je détecte où sont les erreurs et où elles se produisent.
    Ce que je veux c'est que chaque module puisse sortir ses erreurs sur des flots différents afin de cloisonner les erreurs.

    Merci de ne pas parler des exceptions ni l'étude du contexte de pile à la setjmp, ce n'est pas du tout le sujet de ce post.
    Je cherche juste à savoir et à comprendre comment et pourquoi les définitions récursives de macros ne marchent pas dans mon cas ou en général.

    Si vous avez des idées, je vous remercie d'avance pour vos réponses.
    Surtout si ce n'est pas une bonne manière de faire ne vous gênez pas je suis là pour apprendre.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 32
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    Il me semble que le standard impose un ordre lors du preprocessing qui empêche de fait toute récursivité dans les macros.

  3. #3
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    En plus, dans la définition d'une macro, # a un sens bien particuler (voir FAQ). Il est donc clair qu'une macro ne peut pas avoir comme corps une définition de macro.

Discussions similaires

  1. Macro qui sélectionne des colonnes spécifiques
    Par nyto35 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/04/2013, 15h41
  2. [XL-2010] Macro qui récupère des données dans des fichiers protégés
    Par Charlie3 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/02/2013, 10h45
  3. [XL-2010] Macro pour colorer des champs qui dépendent d'autres champs
    Par Mystic_wolf dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 19/12/2012, 12h33
  4. Macro qui copie des données d'un affichage particulier d'un MSP.
    Par grenoult dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/05/2011, 14h50
  5. [WD-2007] Créer une macro qui rempli des etiquettes automatiquement
    Par damienedme dans le forum VBA Word
    Réponses: 1
    Dernier message: 03/09/2009, 12h03

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