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 :

Activer/Désactiver l'affichage des messages


Sujet :

C++

  1. #1
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut Activer/Désactiver l'affichage des messages
    Bonjour,

    Je cherche une solution simple et portable (le plus possible) pour définir une macro permettant d'activer et désactiver l'affichage des messages (typiquement std::cout<<.....).

    J'ai trouvé quelques manière de faire et j'ai retenue celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef DEBUG 
    #define D(x) x
    #else 
    #define D(x)
    #endif
    Sinon, je vois souvent quelque chose de très ressemble avec un do{} while() en plus (ou parfois un for( ; 0 ; ) ) mais je comprends pas l'interêt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef DEBUG 
    #define D(x) do {x} while (0)
    #else 
    #define D(x) do {} while (0)
    #endif
    De manière général si quelqu'un peut me conseiller "la bonne" manière de faire, je suis toute ouïe.

    Merci de votre aide.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Il me semble que le do {} while(0) permet de :
    - limiter la portée des variables ;
    - faire comme si la valeur est "void".

    Sinon, en C++, on peut écrire une fonction template "debug" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<typename T> void DEBUG(const T & t)
    {
          #ifdef DEBUG
                 std::cerr << t << std::endl;
          #endif
    }
    Ce qui te permettra par la même occasion de pouvoir surcharger ta fonction DEBUG pour, par exemple, afficher de manière différentes certains types (surtout pour les pointeurs).

  3. #3
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Pourquoi "templatiser" si tout mes messages ont la même forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout<<"\n\t\t"<<__FILE__<<":"<<__LINE__<<Error: ...";
    Je veux juste definir un moyen pour faire : message d'erreur ON ou OFF (pour que tous les massages d'erreurs s'affichent ou non).

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Tu pourras par exemple donner des objets à ta fonctions pour avoir plus de renseignements sur leur état (?)

  5. #5
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Tu pourras par exemple donner des objets à ta fonctions pour avoir plus de renseignements sur leur état (?)
    OK, j'y songerai plus tard.

    Par contre, j'ai testé les solutions que j'ai citées (ci-dessus) et dans les deux cas rien ne s'affiche.
    Si je fais par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "debug.h"
    #define DEBUG 1
    ...
    int main()
    {
      D(std::cout<<"\n Test ";);
     
      return 0;
    }
    Le message ne s'affiche pas.

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Je n'aime pas trop cette syntaxe

    Pourquoi ne pas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define D(T) std::cout << (T) << std::endl;
     
    D("texte" << 42 << "foo")
    ?

    Cela t'éviteras d'oublier les std::endl

  7. #7
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Tu as raison, je pense faire un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef DEBUG
    #define D(message) do {std::cout << message << std::endl;} while(false)
    #else
    #define D(message) do {} while(false)
    #endif

    Par contre, coment faire pour mettre une condition sur la defintion de DEBUG?
    J'ai essayé cela mais ça ne marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    
    #ifdef DEBUG
    #define D(message) do {std::cout << message << std::endl;} while(false); if(1)
    #else
    #define D(message) do {} while(false); if(0)
    #endif
    Idéalement, je souhaiterais avtiver/désactiver de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define DEBUG ON
    ou
    #define DEBUG OFF
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifdef DEBUG
      #if DEBUG == ON
        #define D(message) do {std::cout << message << std::endl;} while(false);
      #endif
     
      #if DEBUG == OFF
        #define D(message) do {} while(false);
      #endif
    #endif
    Quelque soit la valeur que je donne à DEBUG, les messages ne s'affchent pas,comme si la macro était systématiquement redéfinie (dans le if DEBUG == OFF).

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Soit une des bibliothèque défini la macro DEBUG, soit c'est ton IDE/Compilateur qui le fait.

    Essaye d'utiliser une macro "MYDEBUGPERSO"

  9. #9
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    C'est déjà une macro perso, et pour cette exemple je n'utilise aucune lib ni IDE.

    Par contre en activant certains flag de compilation, le compilateur me dit bien que je suis entrain de redéfinir DEBUG lorsque je suis ici :


    EDIT: j'ai l'impression que la condition #if n'est pas testée (ou est toujours vrai?) et qu'on rentre systematiquement dedans.


    EDIT2: en fait je viens de me rendre compte que dans mon #if je faisais une comparaison de chaines de caractère, donc soit j'utilise une fonction faite pour cela, soit j'attribut une valeur entier à ON et OFF pour pouvoir les tester ensuite.

  10. #10
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Au final, je vais obter pour cela :

    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
    #ifndef DEBUG_H
    #define DEBUG_H
     
    #include <iostream>
     
    #define OFF 0
    #define ON 1
     
    #define FLAG ON // ou OFF
     
    #if FLAG == ON
      #define DEBUG
    #endif
     
     
    #ifdef DEBUG
      #define DEBUG(str) do { std::cout << str << std::endl; } while( false );
    #else
      #define DEBUG(str) do { } while ( false );
    #endif
     
    #endif  /* DEBUG_H */
    Si personne y voit d'erreurs ou de d'améliorations, je considère comme résolu.

    Merci de votre aide.

  11. #11
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Il me semble que le do {} while(0) permet de :
    - limiter la portée des variables ;
    - faire comme si la valeur est "void".
    Mais pourquoi ce do while ? Un simple bloc suffirait non ? (reliquat du C peut être ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // assez inutile ici, mais c'est pour l'exemple
    #define DBG(str) { std::cerr << str << std::endl; }

  12. #12
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Je n'ai pas lu en détail, mais cela pourrait être différent si on a des "if" :
    http://stackoverflow.com/questions/1...vs-scope-block

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Mais pourquoi ce do while ? Un simple bloc suffirait non ? (reliquat du C peut être ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // assez inutile ici, mais c'est pour l'exemple
    #define DBG(str) { std::cerr << str << std::endl; }
    Le do while t'indiquera une erreur si tu oublies le ; de fin de ligne, ça peut servir
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Comment activer le service d'affichage des messages?
    Par ceroxono dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 02/06/2009, 17h29
  2. [EasyPHP] Désactiver l'affichage des erreurs sous EasyPHP
    Par shub dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 02/12/2007, 08h00
  3. [MySQL] Désactiver l affichage des erreurs
    Par eon-of-the-scorn dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 31/07/2006, 11h49
  4. Réponses: 2
    Dernier message: 05/05/2006, 14h49
  5. Réponses: 2
    Dernier message: 23/03/2006, 10h37

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