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

Langage C++ Discussion :

Utilisation de using namespace


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Par défaut Utilisation de using namespace
    [3DArchi, suite de la séparation de cette discussion]
    en haut tu mets :
    using namespace std ;(et comme çà t'évites d'écrire de temps en temps std:: )

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par razily Voir le message
    en haut tu mets :
    using namespace std ;(et comme çà t'évites d'écrire de temps en temps std:: )
    Hou lààà... je me méfie de ce genre de conseil à l'emporte pièce...

    Il faut bien comprendre que les espaces de noms ne sont pas uniquement là pour faire joli, mais pour limiter les risques d'ambigüité si deux bibliothèques définissent une classe dont le nom est identique, et permettre ainsi d'éviter aux programmeur d'avoir à préfixer le nom de leurs propres classes.

    Le gros problème avec la directive using namespace est qu'elle a la fâcheuse manie de se répandre partout si elle est placée dans un fichier d'en-tête.

    Je te rappelle en effet que l'inclusion de fichier est récursive en C++, et donc que si tu met la directive dans un fichier d'en-tête, elle se retrouvera dans tous les fichiers qui incluent le fichier d'en-tête... Y compris dans les fichier qui incluent un fichier qui inclut un fichier qui inclut un fichier (qui... on peut continuer longtemps comme cela ) dans lequel se trouve la directive

    Tu risque donc très fort, alors que tu n'aurais eu aucun problème si tu ne l'avais pas mise, de te retrouver avec des ambigüités t'obligeant, malgré tout, à utiliser le nom long (comprend: avec l'espace de noms) si, d'aventure, tu travaille effectivement avec plusieurs bibliothèques.

    Il faut donc prendre l'habitude de placer cette directive uniquement dans les fichier d'implémentation dont on est sur qu'il ne seront jamais inclus par ailleurs (ce qui disqualifie donc les fichiers d'implémentation de fonction template).
    Et puis, std:: , c'est pas si embêtant que ca à écrire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre éclairé Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Hou lààà... je me méfie de ce genre de conseil à l'emporte pièce...

    Il faut bien comprendre que les espaces de noms ne sont pas uniquement là pour faire joli, mais pour limiter les risques d'ambigüité si deux bibliothèques définissent une classe dont le nom est identique, et permettre ainsi d'éviter aux programmeur d'avoir à préfixer le nom de leurs propres classes.

    Le gros problème avec la directive using namespace est qu'elle a la fâcheuse manie de se répandre partout si elle est placée dans un fichier d'en-tête.

    Je te rappelle en effet que l'inclusion de fichier est récursive en C++, et donc que si tu met la directive dans un fichier d'en-tête, elle se retrouvera dans tous les fichiers qui incluent le fichier d'en-tête... Y compris dans les fichier qui incluent un fichier qui inclut un fichier qui inclut un fichier (qui... on peut continuer longtemps comme cela ) dans lequel se trouve la directive

    Tu risque donc très fort, alors que tu n'aurais eu aucun problème si tu ne l'avais pas mise, de te retrouver avec des ambigüités t'obligeant, malgré tout, à utiliser le nom long (comprend: avec l'espace de noms) si, d'aventure, tu travaille effectivement avec plusieurs bibliothèques.

    Il faut donc prendre l'habitude de placer cette directive uniquement dans les fichier d'implémentation dont on est sur qu'il ne seront jamais inclus par ailleurs (ce qui disqualifie donc les fichiers d'implémentation de fonction template).
    Et puis, std:: , c'est pas si embêtant que ca à écrire
    Pourquoi , je fais seulement çà pour std ;
    vu qu'on utlise souvent cout et cin
    et c'est un prof à la fac qui nous a appris l'astuce afin d'éviter d'écrire
    std::

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par razily Voir le message
    et c'est un prof à la fac qui nous a appris l'astuce afin d'éviter d'écrire
    Ton prof t'as dit une bêtise. std:: n'use ni ton clavier ni tes bouts de doigts

  5. #5
    Membre éclairé Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Ton prof t'as dit une bêtise. std:: n'use ni ton clavier ni tes bouts de doigts
    c'est pas çà , mais le fait de lire les codes remplis de std:: alourdit les yeux et je ne vois pas vraiment en quoi le fait d'écrire using namespace std;
    est un risque

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par razily Voir le message
    c'est pas çà , mais le fait de lire les codes remplis de std:: alourdit les yeux et je ne vois pas vraiment en quoi le fait d'écrire using namespace std;
    est un risque
    Parce que std contient beaucoup de mots courts et "evidents". Par exemple, elle définit des fonctions min et max, des classes list, et vector, et string, etc etc etc...

    Comme ce sont des mots très courants, dans un projet un peu large, il y a un risque que quelqu'un définisse sa fonction, ou variable, appelée "min", ou "list", et là, sans namespace, tu peux avoir des bugs étranges si ton programme confond les deux "min", ou les deux "list" (le compilateur en attrape beaucoup, mais ceux qu'il ne chope pas sont très durs à trouver).

    Maintenant, les namespaces ne sont pas la seule solution (c'est vrai qu'on arrive vite à des noms ridiculement longs). Une méthode consiste à nommer ses variables EN FRANCAIS. Cela réduit les risques. Une autre à suivre des règle de nommage différentes de la STL (par exemple, éviter les noms tout en minuscule). A l'échelle d'un projet normal (ie pas trop énorme), on peut vivre presque sans namespaces (sachant que des namespace mal gaulés provoquent autant de bugs tout aussi dégoutants, et que l'abus des namespaces provoque souvent une "ossification" prématurée du code).

    Même dans de gros projets, les using dans les cpp, ce n'est pas trop dangereux.

    Là où il faut faire très attention, c'est quand tu utilises des directives using dans des entêtes destinées à être utilisés dans plusieurs projets, voire diffusés à l'extérieur. Le préprocesseur du C++ est extrèmement bête, et le seul fait d'inclure le .h, parfois de manière indirecte, peut alors créer des conflits de nom.

    Francois

Discussions similaires

  1. using namespace std;
    Par elekis dans le forum SL & STL
    Réponses: 27
    Dernier message: 26/03/2006, 23h01
  2. using namespace std Vs std::
    Par BigNic dans le forum SL & STL
    Réponses: 12
    Dernier message: 24/01/2006, 15h26
  3. probleme avec : using namespace
    Par firejocker dans le forum C++
    Réponses: 3
    Dernier message: 28/11/2005, 12h15
  4. 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