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 :

Probleme de #define


Sujet :

C

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut Probleme de #define
    Bonjour,

    J'ai le code suivant qui ne me génère pas d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    typedef enum _TOTO {
      VAL1 = 0,
      VAL2,
      VAL3
    } TOTO;
     
    #define MY_CONFIG  VAL2   
    #if (MY_CONFIG == VAL1)   
    // ...   
    #else   
      #error Config error   
    #endif
    => je ne peux pas modifier TOTO car il est défini dans une bibliotheque

    Comment faire pour détecter l'erreur ?
    => a priori, le pre-processeur remplace VAl1 et VAL2 par la valeur 0 car les définitions qui sont dans l'enum ne sont pas vues par celui-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef enum _TOTO {
      VAL1 = 0,
      VAL2,
      VAL3
    } TOTO;
     
    #ifndef VAL1   
      #error VAL1 undef   
    #endif
    => j'ai le message d'erreur qui s'affiche

    Merci d'avance


    -----------
    Remarque :
    Dans un fichier .h, je déclare la valeur de CONFIG pour dire dans qu'elle configuration je suis

    Et dans un .c j'utilise CONFIG comme paramêtre d'une fonction (la fonction fait partie d'une bibliotheque que je ne peux pas modifier) :

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Quel rapport entre l'énumération et les directives de préprocesseur ?

    Quand le pré-processeur évalue VAL2, cela n'a rien à voir avec le VAL2 de l'énumération puisque c'est le compilateur qui s'en chargera plus tard.

    VAL1 semble effectivement valoir 0 puisqu'il n'est pas défini. On peut supposer que VAL2 faut la même chose, donc 0 == 0 et du coup, pas d'erreur. Voici un test que j'ai fait :
    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
    31
    32
    #include <stdio.h>
    #include <stdlib.h>
     
    #define CONFIG VAL2
    #define VAL2 0
     
    #if ( VAL1 == 0 )
    	#pragma message "VAL1 is 0"
    #endif
     
     
    #if ( CONFIG == VAL1)
    	#pragma message "Config OK"
    #else
    	#error Config KO
    #endif
     
    int main(void)
    {
    	return 0;
    }
     
    /* Sortie console :
     
    $ alias gccw
    alias gccw='gcc -Wall -Wextra'
     
    $ gccw test.c
    test.c:9:10: note: #pragma message: VAL1 is 0
    test.c:14:10: note: #pragma message: Config OK
     
    */
    Je sais que ça ne résout pas ton problème, mais comme il n'est pas clairement défini, explique nous un peu plus ce que tu souhaites vérifier.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Merci, je pensais aussi partir dans cette direction.

    Mais ça risque de poser des problème si l'enum change lors d'une mise à jour de la bibliothèque
    => Mais je ne vois pas d'autre méthode possible...

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je suis quasiment sûr que tu ne pourras pas te baser sur les valeurs de l'énumération pour faire de la compilation conditionnelle. Le pré-processeur n'évalue pas le code, uniquement les directives le concernant. Que souhaites-tu vérifier exactement ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    Citation Envoyé par boboss123 Voir le message
    Merci, je pensais aussi partir dans cette direction.

    Mais ça risque de poser des problème si l'enum change lors d'une mise à jour de la bibliothèque
    => Mais je ne vois pas d'autre méthode possible...

    Il n'y a aucun rapport entre l'enum et tes tests de macro pre-processeur.

    Ce qui peut poser problème c'est l'inverse de ce que tu montres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #define VAL1 whatever
     
    ...
     
    ...
     
    // dans un include plus tard
    enum {
      VAL1 = 0,
      VAL2
    } TOTO;

    VAL1 dans l'enum n'existera pas, il sera remplacé par "whatever".

    Si tu veux comprendre ce qui se passe après passage du pré-processeur, tu peux compiler ton code avec "gcc -E moncode.c"

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Que souhaites-tu vérifier exactement ?
    ce que je voulais vérifier, c'est que CONFIG soit correctement défini
    => il doit valoir certaines des valeurs de l'enum (mais pas toutes)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #define CONFIG VAL6
     
    #if (CONFIG != VAL1) && (CONFIG == VAL2)
      #error "valeur non prise en charge"
    #endif
    => mon programme ne gère pas encore toutes les valeurs de l'enum et je voudrais donc générer une erreur en cas d'utilisation d'une des valeurs non gérées

Discussions similaires

  1. Probleme User-Defined Type/ Public Object Module
    Par hype_brandon dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 12/07/2017, 18h29
  2. Probleme de define _SECURE_SCL
    Par xabila dans le forum Visual C++
    Réponses: 2
    Dernier message: 18/09/2009, 19h29
  3. Probleme avec un define d'un char **
    Par freuh94 dans le forum C
    Réponses: 3
    Dernier message: 27/05/2009, 16h11
  4. Probleme de define
    Par themadmax dans le forum C++
    Réponses: 2
    Dernier message: 21/07/2008, 17h02
  5. Probleme avec #define
    Par Premium dans le forum C
    Réponses: 3
    Dernier message: 26/11/2006, 12h43

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