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 C, expansion d'un define


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Par défaut Macro C, expansion d'un define
    Bonjour tout le monde,

    j'essaye de trouver une solution au problème de macro C ci-dessous.

    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
     
    #define    INDEX_1   1
    #define    INDEX_2   2
     
    unsigned char   LBa_MonBuffer1[4] = {1,2,3,4};
    unsigned char   LBa_MonBuffer2[4] = {4,3,2,1};
     
    unsigned char LBa_output[4] = {0};
     
    #define   MA_SUPER_MACRO( source, index, destination ) \
    { \
        memset(destination,0,sizeof(destination) ); \
        memcpy(destination,source ## index , sizeof(destination) ); \
    }\
    /** Ce qui suit est fonctionnel **/
    MA_SUPER_MACRO( LBa_MonBuffer, 1, LBa_output ); /** Resultat : LBa_output= 1,2,3 et 4 **/
    MA_SUPER_MACRO( LBa_MonBuffer, 2, LBa_output ); /** Resultat : LBa_output = 4,3,2 et 1 **/
     
    /** Ce qui suit est NON fonctionnel **/
    MA_SUPER_MACRO( LBa_MonBuffer, INDEX_1, LBa_output ); /** Resultat attendu : LBa_output= 1,2,3 et 4 **/
    Quelqu'un pourrait me dire si ce que j'essaye de faire est possible ?

    Je vous remercie tous !

    Arnaud

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Essaie en ajoutant un niveau d'indirection qui va forcer l'évaluation de la macro INDEX_1 avant concaténation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define MA_SUPER_MACRO_( source, index, destination ) \
            ...
     
    #define MA_SUPER_MACRO( source, index, destination ) MA_SUPER_MACRO_( source, index, destination )

    Soit dit en passant, à quoi bon memset un buffer que l'on va memcpy de toute manière ?

  3. #3
    Membre Expert
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,

    ta macro ressemble trop à une fonction pour ne pas en faire … une fonction ! surtout que depuis les fonctions static inline les macros qui «font du code» perdent beaucoup de leur attrait.
    De plus, comme tu présentes ça j'ai l'impression que tu vas tôt ou tard essayer de passer une variable comme paramètre index à ta macro → c'est voué à l'échec car le préprocesseur est une des premières phases de la compilation et n'existe plus au runtime.

    Ça sent le problème XY. Il serait sans doute préférable de créer un tableau de buffers que tu accéderais par une variable plutôt que de t'embourber dans une macro. Je dis ça mais je ne connais pas le pourquoi de comment tu as aboutit à cette solution, ne connaissant pas non plus le problème de départ.

    Si tu tiens absolument à faire une «macro code» la solution classique est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define FOO do { \
                  ... \
                } while(0)
    ou éventuellement d'utiliser une extension de ton compilateur, gcc propose par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define FOO ({ \
                  ...\
                })

  4. #4
    Membre habitué
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Par défaut
    Bonjour et merci picodev,

    voici mes réponses:

    Citation Envoyé par picodev Voir le message
    [...]De plus, comme tu présentes ça j'ai l'impression que tu vas tôt ou tard essayer de passer une variable comme paramètre index à ta macro[...]
    Non, je ne chercherai pas à passer une variable en paramètre INDEX...

    Citation Envoyé par picodev Voir le message
    [...]Je dis ça mais je ne connais pas le pourquoi de comment tu as aboutit à cette solution, ne connaissant pas non plus le problème de départ.[...]
    C'est vrai que je n'ai pas exprimé mon problème à la base. Mon souci est purement d'ordre "culture générale": J'essaie de trouver une réponse à : "Est-ce que le compilateur est capable d'expandre un define avant l'expansion de MA_SUPER_MACRO ?"

    Citation Envoyé par picodev Voir le message
    [...]surtout que depuis les fonctions static inline les macros qui «font du code» perdent beaucoup de leur attrait.[...]
    Tu m’intéresses quand tu parles de fonctions static inline. Je ne connais pas, je vais chercher.

    Merci !

  5. #5
    Membre habitué
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    ...
    Soit dit en passant, à quoi bon memset un buffer que l'on va memcpy de toute manière ?
    Bonjour et merci Matt_Houston,
    cette macro n'est qu'un exemple, quelque chose que j'ai écris pour illustrer ma question.
    Alors memset et memcpy peu importe...

  6. #6
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Pouvons-nous commencer par demander l'utilité de la question? Les macros n'ont plus leur grande utilité à par pour rendre le code moins lisible, ajouter des sources d'erreurs, et penser que le programmeur sait plus sur comment optimisé le code qu'un compilateur bien réglé...

  7. #7
    Membre habitué
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Par défaut
    Bonjour,

    Citation Envoyé par fearyourself Voir le message
    [...]Les macros n'ont plus leur grande utilité à par pour rendre le code moins lisible, ajouter des sources d'erreurs[...]
    Je ne cherche pas du tout à optimiser du code. Dire que les macros rendent le code moins lisible signifie peut être que le programmeur n'a pas trouvé un bon nom à sa macro.

    Si je lis : MACRO_IS_BITn_RESET(BYTE,BITn), nous sommes tout à fait capable je pense de savoir ce qu'est censé faire la macro... non ?

    C'est sûr que dans l'exemple pris pour illustrer ma question, ce n'est pas le cas je te l'accorde.

    Citation Envoyé par fearyourself Voir le message
    [...]et penser que le programmeur sait plus sur comment optimisé le code qu'un compilateur bien réglé.[...]
    Je vais parler de ce que je connais: l'embarqué. Les compilateurs sont écris par des humains et de ce que je peux voir quelque fois dans les résultats de compilation, c'est qu'un compilateur n'est jamais parfait même réglé par le meilleur programmeur du monde. Rien ne vaut l'humain. Après tout dépend de ce que recherche le programmeur en embarqué que je suis , performance, taille de code et sécurité.

  8. #8
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Maitre_Kanter Voir le message
    Je vais parler de ce que je connais: l'embarqué. Les compilateurs sont écris par des humains et de ce que je peux voir quelque fois dans les résultats de compilation, c'est qu'un compilateur n'est jamais parfait même réglé par le meilleur programmeur du monde. Rien ne vaut l'humain. Après tout dépend de ce que recherche le programmeur en embarqué que je suis , performance, taille de code et sécurité.
    Tant qu'à faire on peut rester et programmer en assembleur ou binaire alors ;-)

    Je pense que ce que je suis en train de dire est qu'il y a généralement 25k choses à faire avant de commencer à penser à mettre les choses sous forme de macros. Je pense aussi que j'ai eu trop de bugs liés à des soucis de macros et que j'ai passé trop de temps à comprendre comment la cascade de macros provoquait le code généré et pourquoi cela devenait du code entièrement faux...

    Pour ce qui est du code embarqué: oui souvent on ramène à ça quand on parle contre les macros... Et oui, dans le cas embarqué, souvent les compilateurs sont moins matures que pour le cas non embarqué. Mais cela ne veut pas dire que les macros sont à être utilisés à tout bout de champs. Avant C99, il y avait quelques raisons pour utiliser des macros mais je dirai encore une fois: souvent les programmeurs tentent d'écrire du code rapide quand en fait écrire du code propre, testé, maintenable est nettement plus intéressant pour la boîte, les utilisateurs, les autres programmeurs.

    On sort du sujet mais je pense que quand on voit des sujets sur des macros, il faut rappeler que leur utilisation est à prendre avec grande grande grande précaution

  9. #9
    Membre habitué
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2016
    Messages : 10
    Par défaut [RESOLU] Macro C, expansion d'un define
    Citation Envoyé par Matt_Houston Voir le message
    Essaie en ajoutant un niveau d'indirection qui va forcer l'évaluation de la macro INDEX_1 avant concaténation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define MA_SUPER_MACRO_( source, index, destination ) \
            ...
    #define MA_SUPER_MACRO( source, index, destination ) MA_SUPER_MACRO_( source, index, destination )
    Merci Matt_Houston, ça fonctionne !!!

    Rapide et concis !

    PS : surtout que tu n'a pas essayé de me dire que les macros c'est de la crotte...

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

Discussions similaires

  1. Probleme entre macro , global et define
    Par freuh94 dans le forum C
    Réponses: 3
    Dernier message: 03/06/2009, 15h43
  2. MACROS et defines
    Par romeo9423 dans le forum C
    Réponses: 6
    Dernier message: 11/11/2006, 11h31
  3. problème avec const char * et #define macro
    Par CodeurNé dans le forum C
    Réponses: 5
    Dernier message: 20/09/2006, 21h25
  4. [débutant][macros] préscisions sur #define
    Par Spartan03 dans le forum Débuter
    Réponses: 2
    Dernier message: 25/04/2006, 17h44
  5. Réponses: 4
    Dernier message: 05/02/2006, 16h29

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