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 :

Variable & préprocesseur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2008
    Messages : 22
    Par défaut Variable & préprocesseur
    Salut a tous !

    J'ai parcouru la FAQ en vain...

    J'aimerais savoir s'il est possible de vérifier la déclaration d'une variable.
    Pour etre plus précis, je voudrais lancer moi meme l'erreur de compilation "'variable' was not declare in this scope"

    Situation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #define OPEN_TRACE_FILE(fileName) ofstream fTrace(fileName);
     
    #ifdef PRINT_TRACE
    // Vérifier que la variable fTrace a été définie...
    // Si ce n'est pas le cas :
    #error Use 'OPEN_TRACE_FILE(fileName)' before using printTrace(msg)
    // sinon
    #define printTrace(msg) fTrace.write(msg);
    #endif

    Je sais, je sais, c'est pas forcément la meilleur facon de faire, y'a baeucoup mieux, c'est juste par curiosité que je tente comme ca et parce que c'est juste pour débuger...

    Merci d'avance !

    Apo`

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Pourquoi pas tester si OPEN_TRACE_FILE est définie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef OPEN_TRACE_FILE
    #define printTrace(msg) fTrace.write(msg);
    #else
    #error Use 'OPEN_TRACE_FILE(fileName)' before using printTrace(msg)
    #endif

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par Sylvain Togni Voir le message
    Pourquoi pas tester si OPEN_TRACE_FILE est définie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef OPEN_TRACE_FILE
    #define printTrace(msg) fTrace.write(msg);
    #else
    #error Use 'OPEN_TRACE_FILE(fileName)' before using printTrace(msg)
    #endif
    Entre autre parce que OPEN_TRACE_FILE sera défini dés qu'il y aura eu inclusion du fichier dans lequel ... la dénition d' OPEN_TRACE_FILE apparait

    Personnellement, j'aurais presque tendance à dire que printTrace(msg) devrait se charger d'ouvrir le fichier, et à dire qu'elle ne devrait simplement être activée qu'en mode débug (et désactivée en mode release)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 28
    Par défaut
    Concrètement le code donné ne fait pas du tout ce que tu voudrais qu'il fasse.

    Il vérifie que la fonction existe et non pas que la fonction a été utilisée.

    Pour répondre, je pense pas que ce soit possible dans ces conditions.

    Je tiens tout de même à rajouter qu'il faut éviter les déclarations dans des macro. Pour le compilo d'une part, pour les fuites de mémoires éventuelles et pour le débug ... (et imagine que tu veuilles utiliser PRINT_TRACE dans une autre classe ? )

  5. #5
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2008
    Messages : 22
    Par défaut
    Bon, j'ai du mal m'exprimer alors je la refais moins crispé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Appelé pour instancier "fTrace" et définir le fichier de log
    #define OPEN_TRACE_FILE(fileName) ofstream fTrace(fileName);
     
    // Définie la fonction "printTrace" si on est en mode "PRINT_TRACE"
    #ifdef PRINT_TRACE
    // Vérifier que la variable fTrace a été définie...
    // Si ce n'est pas le cas :
    #error Use 'OPEN_TRACE_FILE(fileName)' before using printTrace(msg)
    // sinon
    #define printTrace(msg) fTrace.write(msg);
    #endif
    Dans ce code :
    Citation Envoyé par Sylvain Togni Voir le message
    Pourquoi pas tester si OPEN_TRACE_FILE est définie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef OPEN_TRACE_FILE
    #define printTrace(msg) fTrace.write(msg);
    #else
    #error Use 'OPEN_TRACE_FILE(fileName)' before using printTrace(msg)
    #endif
    OPEN_TRACE_FILE est forcément définie (c'est une macro qui instancie une variable, comme l'a dit Koala01), en revanche, elle n'a pas forcément été appelé, donc "fTrace" n'existe pas nécessairement, comme l'a dit ThePiiX.

    Citation Envoyé par ThePiiX
    Je tiens tout de même à rajouter qu'il faut éviter les déclarations dans des macro. Pour le compilo d'une part, pour les fuites de mémoires éventuelles et pour le débug ... (et imagine que tu veuilles utiliser PRINT_TRACE dans une autre classe ? )
    Entièrement d'accord, c'est juste que la je fais 1) vite fait pour ma propre utilisation que je modère, 2) en test pour voir par curiosité si c'est possible
    En temp normal, je ne déclare pas dans une macro, c'est juste que "printTrace" est utilisé par plusieurs class justement et pour définir fTrace au meme endroit que la fonction printTrace, j'ai fait comme ca (C'est un fichier .h appelé par tous et j'ai pas mis de #ifdef ... #endif, donc pour éviter la redéfinition je fais une macro)

    Bon, j'ai l'impression que c'est peine perdu et que ma curiosité ne sera pas satisfaite, je vais faire autrement tant pis

    Merci a vous en tout ca !


    EDIT : Hmmm... Quelqu'un peut m'expliquer pourquoi meme en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef XXX
    #define XXX
     
    // code
     
    #endif
    Ca met "redefinition" ???? La j'avoue ne plus comprendre le compilo

    Apo`

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    C'est peut être bête, mais ton compilo va te dire que fTrace n'existe pas si tu utilises PRINT_TRACE sans OPEN_TRACE_FILE?

  7. #7
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2008
    Messages : 22
    Par défaut
    Oui en fait... C'est le but Enfin, pas "PRINT_TRACE" mais "printTrace" mais on se comprend je pense.

    Ceci dit, visiblement c'est pas possible de faire comme ca, mais j'ai un autre problème, malgré le #ifndef, j'ai une redefinition dans les .o lors du link :/ Va falloir que je creuse ca !

    Apo`

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    De toute manière le préprocesseur n'a aucune connaissance du C++, donc c'est un peu difficile à faire...
    Et on peut très bien utiliser le préprocesseur pour faire du... java

Discussions similaires

  1. Variable préprocesseur dans make
    Par Fabozo dans le forum Débuter
    Réponses: 2
    Dernier message: 11/09/2008, 17h03
  2. [XHTML] Problème de variable &
    Par navis84 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 07/08/2008, 09h55
  3. Réponses: 11
    Dernier message: 10/03/2007, 02h01
  4. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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