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

SL & STL C++ Discussion :

using namespace std;


Sujet :

SL & STL C++

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Par défaut using namespace std;
    bonjour,suite a un debat houleux sur l'utilisation ou non des namespaces, j'aurais voulu savoir si oui ou non c'est un crime de mettre

    using namespace std;

    en debut de fichier.


    PS, je connais l'utilisation des namespace, et je sais les creer et les utiliser.
    la question n'est pas les namespaces sont utiles ou non, la question est a quoi sert using namespace std; . En esperant ne pas declancher un troll

    merci

    a++

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Disons que ça n'a aucune importance en début de fichier source (juste après les headers, cela va de soi), mais c'est un crime capital de mettre cela dans un fichier d'en-tête.

    En gros, c'est l'idée générale.
    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.

  3. #3
    Membre expérimenté
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par défaut
    Les namespace comme leur nom l'indique sont des espace de nom
    Plus serieusement, quand tu te retrouves à utiliser de nombreuses classes et librairies diferentes, il est frequent de tomber sur des noms de classe identique => problèmes !
    Pour régler le problème, il existe les namespace. En gros, tu donne + qu'un nom à ta classe au cas ou les utilisateur aurait une librairie avec une classe de meme nom...

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    namespace myspace {
     
    class A {
    ...
    };
     
    };
    ici ma classe A est protegé par un namespace...

    Donc soit on prefixe tout par le namespace (ça c'est trés propre mais parfois trés chiant).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    myspace::A objA = ...;
    Soit on utilise le namespace tout le temps. Dans ce cas le compilo peut gueuler s'il existe une autre classe de nom A


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    using namespace myspace;
    ...
    A objA = ...;
    ...
    Voilà, c'est exactement pareil pour la stl

    Quelques precisions :

    - JAMAIS de using namespace dans un fichier .h !!! C'est trés trés crade

    - Le plus propre c'est de ne jamais utiliser le using namespace... Mais tout le monde le fait parceque c'est quand meme pratique ^^

    - La plupart du temps on met le using namespace en debut de .cpp, OK mais on sait alors à quoi s'attendre en cas de noms multiples.

    - Un peut plus propre mais c'est trés rare, tu peux aussi faire tes using namespace à chaque debut de fonction... comme ça tu ne declare que ceux dont tu as besoin et là ou tu en a besoin... ça c'est clean tip top ^^

    J'espere que je suis claire... je ne suis pas un trés bon prof

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Dans ce cas le compilo peut gueuler s'il existe une autre classe de nom A
    Et pire ya pas un risque de courcircuiter des classes?

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Par défaut
    heu en fait, je comprend pas pourquoi c'est crade dans un piont h et pas dans un .cpp est ce du au linkage??

    merci

    a++

  6. #6
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Car il se propagera dans tous les fichiers où tu inclueras ton en-tête et ça peut facilement te donner des erreurs de compilation sans t'en rendre compte facilement

  7. #7
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Et ça inhibe l'intérêt du namespace car si on veut utiliser une autre fonction située dans autre namespace on sera obligé de la précéder de namespace::fonction,même si elle est trés fréquente;
    car un "using namespace" au début d'un fichier est valable dans tout les blocs du fichier il me semble.

    Pouvait vous comfirmer que si on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    using namespace std;
     
     
    void f(){
         using namespace mon_namespace;
         cout<<endl;
         }
    Si "cout<<endl" est redéfini dans "mon_namespace" le "using namespace std;" le courcircuitera et le prog donc utilisera le cout classique?

    J'ai un gros doute.

  8. #8
    Membre expérimenté
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par défaut
    Et pire ya pas un risque de courcircuiter des classes?
    Qu'est ce que tu entend par courcuircuiter ? normalement, à part si les signatures sont exactement les memes... le compilo devrait gueuler

    heu en fait, je comprend pas pourquoi c'est crade dans un piont h et pas dans un .cpp est ce du au linkage??
    Imagine qu'un utilisateur Lambda se sert de tes code et include le .h en question... il fait un using namespace sans le savoir et il ne poura rien y faire. En regle generale, il faut faire le moins de chose possible dans un .h

    Si "cout<<endl" est redéfini dans "mon_namespace" le "using namespace std;" le courcircuitera et le prog donc utilisera le cout classique?
    Je ne comprend pas trés bien là... Mais si en gros tu definit 2 operateur << avec les meme signatures dans des namespace diferent et que tu fait un using des deux... ben ça bug forcement

  9. #9
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut
    Ton dernier code ne compilera pas car il y aura une ambigüité entre std::cout et mon_namespace::cout lors de l'instruction cout << endl; .

  10. #10
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Je me demandais si il n'y avait pas de priorité dans les namespace:
    Soit prime celui qui est le plus global.
    Soit au contraire c'est celui qui est le plus proche (au niveau des blocs) de la fonction.

    Mais apparemment ce n'est ni l'un ni l'autre:
    ça plante à la compile.

    Merci de l'info.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Par défaut
    Oui, c'est tellement clair pour celui qui lit un code de ne pas avoir à rechercher d'ou vient telle ou telle methode.
    Et c'est tellement interessant de faire std:: ou myNameSpace::
    Alors, c'est presqu'un crime d'utiliser using namespace.

  12. #12
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Par défaut
    merci;

    je crois que j'ai compris

    merci

    a++

  13. #13
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3

  14. #14
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Personellement j'utilise std:: à chaque reprise

  15. #15
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par Luther13
    Oui, c'est tellement clair pour celui qui lit un code de ne pas avoir à rechercher d'ou vient telle ou telle methode.
    Et c'est tellement interessant de faire std:: ou myNameSpace::
    Alors, c'est presqu'un crime d'utiliser using namespace.
    Attention aux déductions systématiques non rigoureuses...

    C'est certes moins fatigant de ne pas avoir à rechercher d'où vient ci et ça, mais il y a aussi des cas particuliers.

    Parfois, certains noms de la librairie standard sont tellement connus qu'il ne viendrait en général pas l'idée de donner le même nom à d'autres objets. Exemple pour cout, cin, endl, les gens savent tous ce dont il s'agit.

    Avoir des std:: devant, ça nuit souvent à la lisibilité dans ce cas précis, car ces mots clés font tout de suite flash dans la tête comme dit mon prof de Spé.

    Bien sûr, dans ces cas-là, c'est c'est peut-être mieux de mettre using std::cout/cin/endl, plutôt que using namespace std, sauf si l'on sait exactement de ce dont il va s'agir dans le code .cpp qui suit... (pas d'appel à des librairies tierces...).

    C'est pour ça qu'il faut éviter de généraliser quelque chose quand on ne peut/sait pas le démontrer.

  16. #16
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    ya pas une écriture plus compacte pour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    using std::cout;
    using std::endl;
    ...
    ?

  17. #17
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Plus compacte?

  18. #18
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using std::cout,cin,endl;
    Ou dans ce style.

  19. #19
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par HanLee
    Parfois, certains noms de la librairie standard sont tellement connus qu'il ne viendrait en général pas l'idée de donner le même nom à d'autres objets. Exemple pour cout, cin, endl, les gens savent tous ce dont il s'agit.
    Ok, tu vas me citer tous les noms de la bibliotheque standard... je ne les connais moi-meme pas tous et parmis les moins connu il y en a qui sont communs.

    Ton exemple est aussi parfait: ca ne m'etonnerait pas de voir quelqu'un nommant ses variables en francais utiliser cout sans penser a cout; ca m'est bien arrive de vouloir nommer une variable int (pour integrale) alors que je sais bien que c'est un mot cle.

  20. #20
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Ok, tu vas me citer tous les noms de la bibliotheque standard... je ne les connais moi-meme pas tous et parmis les moins connu il y en a qui sont communs.

    Ton exemple est aussi parfait: ca ne m'etonnerait pas de voir quelqu'un nommant ses variables en francais utiliser cout sans penser a cout; ca m'est bien arrive de vouloir nommer une variable int (pour integrale) alors que je sais bien que c'est un mot cle.
    Ben non j'cite pas tout, j'ai bien dit cas particuliers quand j'ai parlé, 3 exactement, et je m'arrêterai là (si si). J'ai retenu ma langue pour vector, parce que si tu penses à de la géométrie ou des maths, il y a des grandes chances que vector apparaisse ! Idem pour stack, list, queue...
    Oui pareil ça m'est arrivé pour int... J'comprenais pas De toute façon les erreurs de ce genre c'est vite détecté. Tu te dis "ah oui j'suis bête!".

    Bon c'était des exemples subjectifs, mais assez représentatifs de la plupart (!= tous). Mon post incite pas du tout à utiliser toujours les using tu sais. C'est juste que j'aime pas quand on dit "jamais", tout ça parce qu'il y a un risque de mal faire, aussi petit soit-il. Dans ce cas présent, ça obstrue toute réflexion.
    Ne jamais utiliser les goto, etc. Souvent ces règles ne sont pas pertinentes dans certains cas particuliers. Est-ce une raison pour y obéir ?
    Quand tu sais ce que tu fais, je ne vois pas le problème.
    On évite toujours (!) les using dans les headers parce que le header est universel (ie destiné à être utilisé par n'importe qui).
    Par contre dans les fichiers .cpp qu'on n'inclut pas, si je mets using std::qqch, je suis conscient que je ne pourrais pas utiliser qqch.

    Ptain, mais pourquoi j'mets autant de temps à expliquer un truc ???

Discussions similaires

  1. Probleme avec "using namespace std"
    Par lui88 dans le forum C++
    Réponses: 3
    Dernier message: 22/07/2009, 12h20
  2. Using namespace std erreur
    Par raimais dans le forum C++
    Réponses: 3
    Dernier message: 10/03/2009, 17h29
  3. using namespace std Vs std::
    Par BigNic dans le forum SL & STL
    Réponses: 12
    Dernier message: 24/01/2006, 15h26
  4. probleme avec : using namespace
    Par firejocker dans le forum C++
    Réponses: 3
    Dernier message: 28/11/2005, 12h15
  5. using namespace std...
    Par miminou dans le forum SL & STL
    Réponses: 14
    Dernier message: 24/10/2005, 10h20

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