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 :

Commenter automatiquement une ligne en fonction d'une variable préprocesseur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut Commenter automatiquement une ligne en fonction d'une variable préprocesseur
    Bonjour,

    A votre avis, est-il possible de commenter automatiquement une ligne du style:
    en fonction d'une variable préprocesseur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifndef _DEBUG
       #define Log(DEBUG) //
    #endif
    Bien sûr ici ça ne fonctionnera pas car // va être interpréter par le compilateur comme un début de commentaire... Vous voyez ce que je veux faire?

    Un grand merci d'avance!

  2. #2
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    Tout depend de ce que fais ta ligne a commenté, mais pour ce genre de choses, une macro me semble bien adaptée

    Par exemple une macro qui fait un printf :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifdef DEBUG_FLAG
    #define DEBUGOUTPUT(A)  printf("%d",A); //definition de la macro DEBUG OUTPUT
    #else
    #define DEBUGOUTPUT(A)  //on remplace les DEBUGOUTPUT par...du vide ! 
    #endif

  3. #3
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut
    Salut Ksempac,

    Le problème c'est que dans le define, le // va être interprêté par le compilateur comme un compilateur donc va être éliminé...

  4. #4
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    Le // n'est la que pour commenter ce que j'ai ecrit. Le code sans commentaires est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifdef DEBUG_FLAG
    #define DEBUGOUTPUT(A)  printf("%d",A);
    #else
    #define DEBUGOUTPUT(A)  
    #endif

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    deux avis:

    - les macros c'est le mal, au pire fait un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    #define DEBUG
    //...
    #ifdef DEBUG
       //code de debug
    #endif
    si vraiment tu tiens à le définir à la compilation...

    - pour un code professionel:

    le débug, ça peut être important, quand ce sera en production tu en auras peut être besoin sans pouvoir tout recompiler. Dans ce cas là il vaut mieux pouvoir le définir à l'éxécution ( dans la ligne de commande par exemple, ou fichier de configuration ou autre...)

  6. #6
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    C'est vrai que les macros c'est dangereux. Mais je pense que la premiere solution que tu proposes n'est pas vraiment adaptée : Si la ligne qu'il veut supprimer apparait regulierement dans son code (ce qui semble etre le cas car on dirait un systeme de traces/log) il faut ecrire partout des :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #ifdef DEBUG
     // code de debug
    #endif
    Ceci est assez lourd.

    Avec la Macro tu n'as pas ce probleme. L'important est de bien nommé la Macro pour que le fait que c'est une macro saute aux yeux de suite et qu'il n'y ait pas de confusion (typiquement avec un nom en majuscules du genre DEBUGMONFICHIER(A)).

    En ce qui concerne la définition "à la volée" durant l'exécution, c'est sur que c'est une très bonne idée, mais il faut voir si ca correspond a ces besoins.

  7. #7
    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 Rodrigue
    Salut Ksempac,

    Le problème c'est que dans le define, le // va être interprêté par le compilateur comme un compilateur donc va être éliminé...
    Encore que, je suis tombé sur un drôle de hack dans Visual, pas plus tard qu'hier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #if UNEMACRO
    #define UNEAUTREMACRO /##/
    #else
    #define UNEAUTREMACRO
    #endif
     
    //...
     
    {
       //...
       UNEAUTREMACRO UneInstruction();
       //...
    }
    //...
    Je me demande si gcc accepte un truc du genre, mais puisqu'il existe une option "keep comments" dans le préprocesseur de gcc, il y a fort à penser que ça marche aussi...

    Edit: Sous Visual, pas moyen de le faire marcher avec des commentaires C : J'ai beau tenter diverses combinaisons, la macro de fin n'est jamais remplacée...

    Edit2: Réussi!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #if UNEMACRO
    #define MACROA /##*
    #define MACROB
    #else
    #define MACROA
    #define MACROB /##*
    #endif
     
    void TestMacro(void) 
    {
    	puts("A");
    	MACROA puts("B"); MACROB */
    	puts("C");
    }
    Je teste sous GCC à présent...

    Edit3: Échec sous gcc:
    Citation Envoyé par cpp, gcc version 3.4.6 20060404 (Red Hat 3.4.6-3)
    pasting "/" and "/" does not give a valid preprocessing token
    Et on se retrouve avec un espace entre les deux caractères, que ce soit pour les commentaires C++ ou les commentaires C...
    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.

  8. #8
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut
    Magnifique Médinoc! Je viens d'essayer sur un exemple simple et le coup du /##/ (qu'au passage je connaissais pas et dont je ne trouve aucune documentation à ce sujet) a l'air de fonctionner parfaitement

    Lundi, j'essaye ça au bureau. Merci à tous!

  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
    Enfin, comme l'ont montré mes tests, c'est totalement non-portable (à moins que gcc 4 accepte ce hack) et à mon avis, non-standard...
    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.

Discussions similaires

  1. [XL-2003] Remplir automatiquement une ligne en fonction d'une cellule
    Par Tonio68 dans le forum Excel
    Réponses: 8
    Dernier message: 25/03/2011, 18h51
  2. créer une macro en fonction d'une ligne particulière
    Par antfo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 19/03/2010, 17h22
  3. [XL-2003] Supprimer une ligne en fonction d'une valeur de cellule
    Par FCL31 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 02/09/2009, 17h20
  4. Réponses: 1
    Dernier message: 10/02/2008, 19h56
  5. Recherche une ligne en fonction d'une date
    Par c+cool dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/09/2006, 15h30

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