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 :

proprete du code avec define


Sujet :

C

  1. #1
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut proprete du code avec define
    bonjour ,
    J'ai ce petit code qui marche comme je lui demande seulement j'ai l'impression que c'est sale.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(int argc,char **argv)
    {
        if(argc>1)
            if (argv[1][0]=='v')
                #define VERBOSE
     
        #ifdef VERBOSE
            fprintf(stdout,"Verbose \n");
        #endif
        return EXIT_SUCCESS;
    }
    c'est pour eviter de mettre les printfs sous commentaire en version production et enlever les commentaires quand je dois retester.
    je me contente actuellement de lancer le programme comme suit
    ./test v arg2 arg3 ...
    Merci

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par lilington Voir le message
    bonjour ,
    J'ai ce petit code qui marche comme je lui demande seulement j'ai l'impression que c'est sale.
    C'est d'autant plus sale que c'est faux

    le define est effectué à la pré-compilation.. Il ne tient donc pas compte du if, qui lui est effectué à l'exécutuion...

    2 solutions donc, une souple à l'exécution, une dépendante de la compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    static int VERBOSE = 0 ;
     
    int main(int argc,char **argv)
    {
        if(argc>1)
            if (argv[1][0]=='v')
                VERBOSE = 1 ;
     
        if ( VERBOSE == 1 )
            fprintf(stdout,"Verbose \n");
     
        return EXIT_SUCCESS;
    }
    Sinon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    i
    nt main(int argc,char **argv)
    {
        #ifdef VERBOSE
            fprintf(stdout,"Verbose \n");
         #endif
     
        return EXIT_SUCCESS;
    }
    mais alors il faut compiler avec le flag -DVERBOSE ou sans, et l'affichage ne dépendra pas de paramètre de lancement.


  3. #3
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    oui pour sale, oui pour precompilation mais currieusement ca marche quand meme quand je lance le truc.
    je sais pas pourquoi mais ca marche.
    ptre un probleme avec gcc je suis sous fedora 16 / gcc version 4.6.2 20111027 (Red Hat 4.6.2-1) (GCC)

    bref je retiens ta 2eme car la premiere me plait pas trop.
    sinon j'ai pense a une 3eme methode pour eviter les 'if'
    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
    void verbose(const char *str,int truc)
    {
        if(truc==1)
            fprintf(stdout,"%s\n",str);
    }
    int main(int argc,char **argv)
    {
        int flag_v=0;
        if(argc>1 &&argv[1][0]=='v')
              flag_v=1;
        verbose("je suis verbeux",flag_v);
        ....
         verbose("hmmm je suis tres verbeux",flag_v);
        ...
    }
    bon j'aurait du reflechir avant de poster. je mets resolut mais dis moi pourquoi mon premier exemple a marche? j'arrive pas a comprendre pourquoi.

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ton code est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(int argc,char **argv)
    {
        if(argc>1)
            if (argv[1][0]=='v')
                fprintf(stdout,"Verbose \n");
        return EXIT_SUCCESS;
    }

  5. #5
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    Citation Envoyé par diogene Voir le message
    Ton code est équivalent à :
    a la difference que je ne tape qu'une seule fois le if()
    ca me fait economiser des lignes de code. avec 50 apparition fois if()printf ca devient long quoi...

    je pense que le mien dois quand meme etre legerement moins rapide puisqu'il y a appelle de fonction supplementaire.

  6. #6
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Non ton code est totalement faux et tombe en marche par miracle.

    Les define et ifdef sont des oéprations preprocessor, avant même la compilation (je ne parle même pas encore d'exécution).

    Le preprocessor remplace au fur et à mesure qu'il les rencontre les instructions qu'il sait gérer.

    Ajoute une autre ligne de printf et lance ton programme sans le paramètre v, la ligne s'affichera..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main(int argc,char **argv)
    {
        if(argc>1)
            if (argv[1][0]=='v')
                #define VERBOSE
     
        #ifdef VERBOSE
            fprintf(stdout,"Verbose \n");
        #endif
        #ifdef VERBOSE
            fprintf(stdout, "Oh ca ne marche plus !\n");
        #endif
        return EXIT_SUCCESS;
    }
    parce que ce code est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(int argc,char **argv)
    {
        if(argc>1)
            if (argv[1][0]=='v')
                fprintf(stdout,"Verbose \n");
        fprintf(stdout, "Oh ca ne marche plus !\n");
        return EXIT_SUCCESS;
    }
    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.

  7. #7
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    oui, merci pour l'info je compris
    en faite mon code marchait par hazar et apres compilation il est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(int argc,char **argv)
    {
        if(argc>1)
            if (argv[1][0]=='v')
                fprintf(stdout,"Verbose \n");
        return EXIT_SUCCESS;
    }
    donc quand je lance avec V il fait le printf sinon il va directement return. Meci

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

Discussions similaires

  1. Comment linker avec odbc32.lib dans le code ? (avec gcc)
    Par _Audrey_ dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 06/11/2008, 17h40
  2. propreté de code
    Par Bibouda dans le forum C
    Réponses: 17
    Dernier message: 07/12/2005, 10h54
  3. Probleme en compilant le code avec C2.EXE ?!?!?
    Par angelevil dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 17/11/2005, 16h13
  4. help sur un petit code avec XMLHttpRequest et setTimeout
    Par grinder59 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/10/2005, 10h22
  5. [UML] génération de code avec omondo.uml
    Par RENAULT dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 31/10/2003, 13h14

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