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 Vs std::


Sujet :

SL & STL C++

  1. #1
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut using namespace std Vs std::
    quels les avantages et les incovénients d'utiliser un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    using namespace std
    vector<int> myVector;
    plutot que faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <vector>
    /* d'autre code*/
    std&#58;&#58;verctor<int> myVector;
    en fait dans ma boite une règle de dev nous oblige à utiliser la solution std:: mias je ne comprend pas bien pourquoi.

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Std est l'espace de nommage standard.

    d'autres objets vector peuvent etre crées dans d'autres espacs de nommage (xxx par exemple) et cohabiter avec celui-ci grace aux std:: et xxx::

    Si tu utilises unsing namespace tu t'interdis cette posibilité...

  3. #3
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Donc entres autres, puisque tes headers peuvent être inclus par tout le monde, ce n'est vraiment pas conseillé d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using namespace std;  // ou n'importe quel autre
    dedans.

    Par contre dans tes .cpp, le problème ne regarde que toi
    Le "using" peut te simplifier le code, mais tu seras parfois obligé de t'en passer si il y a des conflits. Sinon dans ces cas là tu pourras toujours utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using std&#58;&#58;cout;
    par exemple, pour ne pas utiliser le namespace en entier, mais seulement ce qui t'intéresse et ne "conflicte" pas
    And still we will be here, standing like statues ...

  4. #4
    Membre actif Avatar de amaury pouly
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 157
    Points : 224
    Points
    224
    Par défaut
    personnellement j'ai eut des problème avec using namepsace std à cause des conflits et donc depuis j'utilise systématiquement std:: . çà coûte rien mais çà évite les problèmes

  5. #5
    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
    Il y a deux cas: dans les entêtes et en dehors des entêtes (et après tous ceux-ci).

    Dans les entêtes c'est généralement une très mauvaise idée de faire un using namespace, ou même des using std::nom. Le résultat est que tout ceux qui incluent cet entête directement ou non se retrouve avec ces noms importés dans le namespace global et ça peut poser des conflits. Cas vécu: un entête inclus indirectement faisait un using namespace std, un autre définissait un type list global, un troisième incluait <list> résultat mon code ne compilait alors que je n'étais client direct que de deux de ces entêtes, je n'était que client indirect du troisième...

    Dans le corps, il y a aussi des risques de conflits, mais au moins le problème apparaît dans le code de celui qui a décidé de faire un using, pas de quelqu'un qui n'a même pas idée qu'un using est fait. Cela ne veux pas dire qu'une modification dans un fichier qu'on ne maîtrise pas ne va pas entraîner indirectement une erreur dans le tient. Ce fichier pouvant être l'implémentation de la bibliothèque standard (puisqu'en C++ tout entête standard peut inclure n'importe quel autre).

    Il est cependant des cas où l'utilisation de using est bien agréable, parfois quasiment obligatoire, parce que ça permet d'utiliser la recherche des noms non qualifiés. Mais dans ces cas, on peut restreindre la portée de using à un bloc. On peut écrire ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <typename T>void maFonction&#40;T& a, T& b&#41; &#123;
       ...
       using std&#58;&#58;swap;
       swap&#40;a, b&#41;;
       ...
    &#125;
    et on utilisera soit std::swap, soit un swap pour le type paramètre du template défini dans le namespace global ou dans le namespace où se trouve définit ce type s'il y en a un.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    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 Gandalf
    Std est l'espace de nommage standard.

    d'autres objets vector peuvent etre crées dans d'autres espacs de nommage (xxx par exemple) et cohabiter avec celui-ci grace aux std:: et xxx::

    Si tu utilises unsing namespace tu t'interdis cette posibilité...
    On peut souvent résoudre les ambiguités en qualifiant les noms...

    Note que personnellement, je n'utilise pas using namespace, il y a un peu trop de noms définis dans la bibliothèque standard.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Membre régulier Avatar de Blowih
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    Salut,
    Donc entres autres, puisque tes headers peuvent être inclus par tout le monde, ce n'est vraiment pas conseillé d'utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using namespace std;  // ou n'importe quel autre
    +1

    delpus si tu travaille avec VisualC++ 6, il appreci moyen le "using namespace", quelque fois j'ai rencontré des erreurs du type "Internal Error" a cause du using namespace.

    Ciao

  8. #8
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Comme le dit Jean-Marc.Bourguet, il vaut mieux spécifier la classe et son namespace.
    Cela simplifie largement la compréhension du code.
    1) pas de conflit
    2) pas de problèmes pour savoir de quel namespace provient ta classe
    3) propreté du code.
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Citation Envoyé par swirtel
    Comme le dit Jean-Marc.Bourguet, il vaut mieux spécifier la classe et son namespace.
    J'ai beau relire JMB, je ne suis pas d'accord avec l'interprétation que tu fais de ses propos.
    D'ailleurs en le paraphrasant, moi aussi je suis d'accord avec lui.
    L'utilisation d'une directive "using namespace XXX" dans un fichier d'entête est à bannir.
    Maintenant dans un fichier source c'est généralement pas une source de problème. Notamment si le namespace en question est le namespace standard.
    Clairement, si j'utilise des fonctions ou des structures qui pourraient entrer en conflit avec un nom de la bibliothèque standard, j'aurais tendance à le qualifier complètement pour éviter les confusions, ou bien utiliser un typedef si c'est un nom à ralonge.

    Maintenant, la première des règles, c'est que lorsque l'on fait partie d'un projet qui fixe des 'coding standards', on les suit à la lettre

  10. #10
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Si ton "code guide" contient une erreur de ce style, cela ne vaut même pas l'intérêt de te lancer dans ce style de projet.

    L'utilisation du namespace permet d'être certain de la classe que tu utilises.

    imagine que tu redéfinisses simplement 'cout' comme étant une instance d'une classe "Ne_fait_rien" et que tu surcharges l'opérateur << pour cette classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    namespace Exemple &#123;
    class Ne_fait_rien &#123;
    &#125;;
     
    Ne_fait_rien cout;
    &#125;
     
    using namespace std;
    using namespace Exemple;
     
    cout << "Alors qui bosse ici ?" << std&#58;&#58;endl;
    --> il est obligatoire d'employer le namespace comme préfix. C'est plus safe et plus claire pour tout développeur qui relira le code.
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  11. #11
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Dans ce cas là évidemment.
    Mais c'est chercher que de définir une variable "cout", surtout membre d'une classe avec un operateur <<

    Tu prends le cas extreme ici, mais il y a à des cas ou tu es bien content d'utiliser using namespace, par exemple si tu utilise très souvent un ensemble de classes provenant du même namespace. Il arrive que les namespaces soient là pour regrouper des classes fonctionnellement proches, même si à priori aucune ambiguité flagrante pourrait se présenter. Dans ce cas là je ne vois pas ce qui empèche de résoudre le namespace dès le haut du fichier CPP.
    And still we will be here, standing like statues ...

  12. #12
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Comme tu veux, mais je préfère procéder de cette manière.

    En plus, cela sera plus facile si tu dois faire des replaces dans ton code de manière automatique.
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Citation Envoyé par swirtel
    Si ton "code guide" contient une erreur de ce style, cela ne vaut même pas l'intérêt de te lancer dans ce style de projet.
    Merci de corriger mon 'coding standard' erroné, cependant mon projet se porte bien et comprend maintenant pas loin de 50 000 lignes de code et perdure depuis plus de 5 ans (www.qgar.org). Tu ne m'en voudras donc pas de persister et de signer en plus.

    L'erreur que tu donnes n'en est pas une, car dans ce cas tu as une ambiguité de nommage et le compilateur te fournira une erreur. Ce sera charge au programmeur de lever cette ambiguité. Maintenant, je travaille rarement avec des personnes qui utilisent 'cout' comme nom de variable, bien qu'une ambiguité bien souvent source d'erreur soit std::min et std::max.
    Le vrai risque d'une directive 'using' globale dans un source est si celui-ci est modifié pour utiliser un composant non prévu au départ (une nouvelle bibliothèque par exemple) dont certains éléments pourraient provoquer un conflit de nommage avec ceux d'un namespace existant. Or quand tu définis l'implémentation d'une classe les dépendances en termes de composants sont généralement fixées. Donc ce cas est très rare.
    De plus, si tu souhaites vraiment l'éviter, il suffit de qualifier complètement tous les noms de ce nouveau module uniquement.
    Ce que tu as à gagner à utiliser une directive globale est généralement un code plus lisible, donc plus facilement extensible et maintenable.

    Libre à toi bien sûr d'utiliser les conventions que tu souhaites si tu en est maître. Mais si tu veux critiquer les méthodes d'autrui, fait le plutôt avec de vrais exemples et de vrais arguments. Prends aussi le soin de lire les intervenants jusque au bout
    Citation Envoyé par VoidSeer
    Clairement, si j'utilise des fonctions ou des structures qui pourraient entrer en conflit avec un nom de la bibliothèque standard, j'aurais tendance à le qualifier complètement pour éviter les confusions, ou bien utiliser un typedef si c'est un nom à rallonge.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/12/2009, 22h24
  2. Probleme avec "using namespace std"
    Par lui88 dans le forum C++
    Réponses: 3
    Dernier message: 22/07/2009, 13h20
  3. Using namespace std erreur
    Par raimais dans le forum C++
    Réponses: 3
    Dernier message: 10/03/2009, 18h29
  4. using namespace std;
    Par elekis dans le forum SL & STL
    Réponses: 27
    Dernier message: 27/03/2006, 00h01
  5. using namespace std...
    Par miminou dans le forum SL & STL
    Réponses: 14
    Dernier message: 24/10/2005, 11h20

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