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 :

Preprocesseur & comparaison de #define


Sujet :

C

  1. #1
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut Preprocesseur & comparaison de #define
    Bonjour,

    une question qui me mortifie :
    comment comparer 2 "valeurs" définies au niveau du préprocesseur par des #define ?

    Un bout de code valant mieux qu'un long discours, voici :
    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
    28
    29
    30
    #define FOO_0 123
    #define BAR_0 123
     
    #define FOO_1 456
    #define BAR_1 789
     
    #define FOO_2 spam
    #define BAR_2 spam
     
    #define FOO_3 spam
    #define BAR_3 eggs
     
    void test ( void )
        {
        #if FOO_0 == BAR_0
        printf("0 : ok\n") ;
        #endif
     
        #if FOO_1 == BAR_1
        printf("1 : ok\n") ;
        #endif
     
        #if FOO_2 == BAR_2
        printf("2 : ok\n") ;
        #endif
     
        #if FOO_3 == BAR_3
        printf("3 : ok\n") ;
        #endif
        }
    ce qui m'envoie sur la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    0 : ok
    2 : ok
    3 : ok
    On voit qu'avec des entiers, j'ai bien la comparaison que j'attends, mais avec des identifiants, ça ne marche pas !
    J'imagine que pour les cas 2 et 3, les FOO et BAR sont remplacés par spam et eggs qui sont eux-même remplacé par rien puisqu'ils ne sont pas définis.
    Et comme rien == rien, les 2 tests sont vérifiés...
    Mais ça ne m'arrange pas ! Je voudrais faire un test qui me permette d'afficher "2 : ok" mais pas "3 : ok".
    Comment faire ?

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 129
    Points
    28 129
    Par défaut
    Citation Envoyé par Captain'Flam Voir le message
    Mais ça ne m'arrange pas ! Je voudrais faire un test qui me permette d'afficher "2 : ok" mais pas "3 : ok".
    Comment faire ?
    Une solution qui ne t'arrange pas serait de définir spam comme étant une valeur, par exemple 42, et eggs comme une autre, par exemple 9. Ca fonctionne aussi avec un caractère ('a' et 'b').

    Sinon, avec des chaînes, je ne sais pas, mais la question est intéressante.

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 196
    Points : 17 165
    Points
    17 165
    Par défaut
    Les comparateurs du préprocesseur ne peuvent comparer que des ints.
    Il existe une unique fonction du préprocesseur: defined, qui vaut 0 si une macro n'est pas définie, et, je crois, 1 sinon.

    Il faut donc que tu fasses des #define de chaque valeurs à créer.

  4. #4
    Membre confirmé
    Avatar de Captain'Flam
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2011
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 273
    Points : 455
    Points
    455
    Billets dans le blog
    1
    Par défaut
    Merci !
    Oui, en effet, pour un define, on ne peut tester que son existence ou sa valeur entière.
    C'est cuit !
    Je vais trouver une autre astuce pour mon cas particulier, mais j'aurais aimé trouver une solution générale...

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

Discussions similaires

  1. Raccourci preprocesseur define
    Par FM_UA dans le forum Langage
    Réponses: 7
    Dernier message: 13/05/2009, 10h37
  2. comparaison de 2 dates
    Par eisti dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/08/2003, 11h33
  3. Comparaison de fichier
    Par danzerg dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2003, 11h49
  4. Comparaison JBuilder avec Sun ONE Studio
    Par chichos dans le forum EDI et Outils pour Java
    Réponses: 4
    Dernier message: 13/11/2002, 15h08
  5. Comparaison d'un registre 8 bits avec une variable 32 bits
    Par tupperware dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 15/10/2002, 10h25

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