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 :

#define conditionnel à problème


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 511
    Par défaut #define conditionnel à problème
    Bonjour à tous.

    je cherche à faire une macro conditionnelle et comme ce terme n'est pas clair un petit exemple va être plus compréhensible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define MA_MACRO(name) \
       #ifdef ALREADY_DEFINE_##name \
       printf("%s est deja definie\n",name); \
       #else \
       printf("%s n'est pas defini\n",name); \
       #endif
    bien évidemment, mon préprocesseur n'apprécie pas le #ifdef dans un #define
    Qui pourrais me donner une idée pour résoudre le problème

    merci d'avance
    Page sur Developpez : http://pbriand.developpez.com

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    bonjour,

    moi je le ferais dans l'autre sens. Quelque chose du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef ALREADY_DEFINE
       #define MA_MACRO(name) printf("%s est deja definie\n",name);
    #else
       #define MA_MACRO(name) printf("%s n'est pas defini\n",name);
    #endif

  3. #3
    Membre émérite
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    511
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 511
    Par défaut
    Bonjour,

    je ne peux pas dans ce sens car le #ifdef prend en compte un des paramètres de la macro (paramètre name).

    #define MA_MACRO(name) \
    #ifdef ALREADY_DEFINE_##name \
    Page sur Developpez : http://pbriand.developpez.com

  4. #4
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Concrètement je ne crois pas que ce soit possible.
    Parce que les directives de préprocesseur sont évaluées à la compilation et non à l'exécution. De ce fait faire un #ifdef avec une variable n'a pas de sens

    Seule la déclaration de r0d est correcte, parce que #ifdef ALREADY_DEFINE peut être évaluée à la compilation

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    A mon avis, ce n'est pas possible de faire ce que tu veux faire ici. La première question qui me vient à l'esprit est pourquoi veux-tu faire cela? Il y a peut-être (certainement) une meilleures solution.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Effectivement, j'ai beau tourner le problème dans tous les sens, je ne vois pas de solution.
    Ne pourrais-tu pas faire ce que tu veux en utilisant une structure instanciée en global?

  7. #7
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par r0d Voir le message
    Effectivement, j'ai beau tourner le problème dans tous les sens, je ne vois pas de solution.
    Ne pourrais-tu pas faire ce que tu veux en utilisant une structure instanciée en global?
    Et pour le printf peu etre que (je suis un peu rouillé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define MA_MACRO(name) printf(#name" est deja definie\n");
    Tu as aussi la possibilité de placer des warning/erreurs de compile
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #warning "un message"
    #error  "un message"

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par briand patrick Voir le message
    bien évidemment, mon préprocesseur n'apprécie pas le #ifdef dans un #define
    je pense que ce qu'il n'appréie pas, c'est les blancs (espaces) devant..

    Il est tout à fait possible de faire :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifdef TOTO /* Cas ou TOTO est defini */
    #ifdef TATA /* Cas ou TATA et TOTO sont defini */
    fprintf ( stderr, "TITI");
    #else  /* cas ou TATA n'est pas defini mais TOTO l'est */
    fprintf ( stderr, "TUTU");
    #endif
    #else /* Cas ou TOTO n'est pas defini */
    fprintf ( stderr, "TUTLUTUTU");
    #endif

    Mais le pré-processeur n'accepte les #if, #ifdef, #else, etc, que en PREMIERE colonne....

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    je pense que ce qu'il n'appréie pas, c'est les blancs (espaces) devant..
    <snip>
    Mais le pré-processeur n'accepte les #if, #ifdef, #else, etc, que en PREMIERE colonne....
    C'est dans la norme, ça?

    Je viens de tester, Visual et gcc acceptent aussi bien #if que (tab)#if, et même #(tab)if...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    C'est dans la norme, ça?
    aucune idée, mais je me souviens m'être fait jeter plusieurs fois....

    Sinon, je suis également certain qu'il n'apprécie pas ceci :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    #ifdef ALREADY_DEFINE_##name

    Puisque on est en pré-compilation, name n'est pas défini et donc ce ifdef ne correspond pas à une constante...


    Maintenant, je crois que je comprend ce que veux faire le PO, et c'est impossible : je pense qu'il veut pouvoir tester (au runtime) si tel ou tel symbole est défini en le construisant dynamiquement....

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Non, il veut bien le faire en compile-time, mais c'est impossible aussi.

    Un exemple simplifié, imagine qu'il veut obtenir ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    switch(toto)
    {
    #ifdef DEF_A
    case DEF_A: return "DEF_A";
    #endif
    #ifdef DEF_B
    case DEF_B: return "DEF_B";
    #endif
    #ifdef DEF_C
    case DEF_C: return "DEF_C";
    #endif
    }
    À partir de ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    switch(toto)
    {
    #define ITEM (quelque chose)
    #include "DEFs.itm"
    #undef ITEM
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /*DEFs.itm*/
    ITEM(DEF_A)
    ITEM(DEF_B)
    ITEM(DEF_C)
    C'est une chose que j'ai moi-même essayé de faire, avec toutes les valeurs des codes d'erreur de Windows: J'ai été obligé de mettre les #ifdef, à cause des différentes versions du SDK.
    En gros, un #define dont l'expansion donne des #ifdef.

    Réponse:
    ...Et bien je n'ai pas pu le faire, j'ai du passer mon .itm dans une moulinette pour en faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /*DEFs2.itm*/
    #ifdef DEF_A
    ITEM(DEF_A)
    #endif
    #ifdef DEF_B
    ITEM(DEF_B)
    #endif
    #ifdef DEF_C
    ITEM(DEF_C)
    #endif
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    mais c'est absolument évident !!!

    un #define définit une constante, stockée à un certain endroit par le compilo..mais il n'éxécute pas de code.. sauf les quelques instructions définies par les #...


    Il n'y a pas besoin de se torturer la cervelle..

    Il y a tout simplement une erreur de conception si on veut faire ce genre de choses...


    Dans ton exemple des erreurs, il doit y avoir quelque part un GetError (comme le errno) qui te retourne un entier..

    A toi de faire un switch ensuite,


    J'avoue être dans l'incompréhension la plus totale par rapport à ce qu'on pourrait vouloir faire avec ceci...

Discussions similaires

  1. problème avec const char * et #define macro
    Par CodeurNé dans le forum C
    Réponses: 5
    Dernier message: 20/09/2006, 21h25
  2. [W3C] problème avec "id already defined"
    Par mussara dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 05/07/2006, 00h16
  3. Réponses: 6
    Dernier message: 20/06/2006, 14h49
  4. [XSL] Problème "Entity not defined"
    Par FreeCake dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 11/04/2006, 21h36
  5. D6: Problème de $DEFINE $IFDEF
    Par david_chardonnet dans le forum Langage
    Réponses: 6
    Dernier message: 22/02/2006, 16h27

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