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 habitué

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Points : 189
    Points
    189
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    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.

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    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
    Points : 3 958
    Points
    3 958
    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 habitué

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Points : 189
    Points
    189
    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 éprouvé

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    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
    Points : 3 958
    Points
    3 958
    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 habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    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 éprouvé

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    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
    Points : 3 958
    Points
    3 958
    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 habitué
    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
    Points : 171
    Points
    171
    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 habitué

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

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

    je crois que j'ai compris

    merci

    a++

  13. #13
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3

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

    Informations professionnelles :
    Activité : Étudiant

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

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    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
    Points : 3 958
    Points
    3 958
    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 averti Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Points : 369
    Points
    369
    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
    Points : 3 958
    Points
    3 958
    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 éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    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 éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    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