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 :

L'espace de nommage standard


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Points : 149
    Points
    149
    Par défaut L'espace de nommage standard
    Bonjour,

    Je débute en C++, j'ai du mal à comprendre les epaces de nommage. Je sais que qu'il ne faut pas utiliser dans les fichiers entête car l'on peut communiquer la supression de la protection de l'espace de nommage à toutes les unités de compilation ou ce fichier entête est inclue.

    Ce que je ne comprends pas trop c'est ceci : quand je place un fichier d'entête "maison" avant la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using name space standard
    les autre fichiers de la bibliothèques standard sont comme ignorés, par contre quand je le place après la ligne tout fonctionne bien... et ça je comprends pas pourquoi si il existe de la doc sur le sujet merci de me l'indiquer je suis preneur...

    En plus le fait de déclarer des fichiers d'entête pour certains types que je déclare dans mon fichier d'entête dans le fichier .cpp ne me dispense pas de devoir déclarer une nouvelle fois le fichier d'entête du type utilisé dans mon propre fichier d'entête... Ce que je ne comprends pas non plus vu que pour moi il sont déjà déclarés dans le fichier .cpp... Je pense que les déclarations des fichiers .h ne portent que sur le fichier dans lesquels ils sont déclarés, mais une fois que le préprocesseur a fait son travail il ne reste qu'un fichier à compilé donc tout devrait s'y trouver, non ?

    Est-il normal de devoir faire autant de déclaration ou y a t il quelquechose que je fais mal ?

    merci
    "Bien qu'on ait du coeur à l'ouvrage,
    L'Art est long et le Temps est court." - CB

  2. #2
    Membre averti Avatar de Dalini71
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 181
    Points : 343
    Points
    343
    Par défaut
    Mets le code des tes fichiers (ou des morceaux illustrant ton problème), ca nous aidera mieux à comprendre exactement ton soucis et comment le résoudre.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Points : 149
    Points
    149
    Par défaut
    En fait c'est plus un problème général que j'ai eu plusieurs fois... J'ai éteint le PC où se trouvent mes programmes je les posterai...

    pour résumé je fais un fichier d'entête : mon.h

    puis dans un programme je déclare d'autre fichier d'entête si je veux que les fichiers d'entête soit pris en compte je dois faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include<fstream>
    #include<iostream>
    using name space std;
    #include "mon.h"
    et non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include<fstream>
    #include<iostream>
    #include "mon.h"
    using name space std;
    si je fais comme ça le type de données , par exemple, n'est plus reconnu et j'ai une erreur de compilation...
    "Bien qu'on ait du coeur à l'ouvrage,
    L'Art est long et le Temps est court." - CB

  4. #4
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Bonsoir,
    Si tu écrivais namespace en un seul mot, ça devrait mieux marcher...

  5. #5
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Citation Envoyé par PyNub Voir le message
    En plus le fait de déclarer des fichiers d'entête pour certains types que je déclare dans mon fichier d'entête dans le fichier .cpp ne me dispense pas de devoir déclarer une nouvelle fois le fichier d'entête du type utilisé dans mon propre fichier d'entête... Ce que je ne comprends pas non plus vu que pour moi il sont déjà déclarés dans le fichier .cpp... Je pense que les déclarations des fichiers .h ne portent que sur le fichier dans lesquels ils sont déclarés, mais une fois que le préprocesseur a fait son travail il ne reste qu'un fichier à compilé donc tout devrait s'y trouver, non ?
    Holà, pas clair tout ça...
    Va donc lire ces entrées de la FAQ.

    Ce qu'il faut retenir, c'est qu'à chaque fois qu'un élément (variable, constante, fonction, type...), le compilateur doit pouvoir trouver sa déclaration ou sa définition, dans le fichier lui-même ou dans un des fichiers inclus.
    Pour une variable/constante ou une fonction, la déclaration suffit, car elle donne la taille occupée en mémoire.
    Sachant que pour les variables/constantes ou fonctions membres, leur déclaration se situe dans la définition de ladite classe...

    Pour les types, en revanche, on ne peut connaître leur taille que si on connaît leur définition.
    Par conséquent, lorsque l'on utilise un type, il faut impérativement inclure (directement ou indirectement) le fichier d'en-tête dans lequel il est défini.
    En particulier lorsque cette utilisation a lieu dans un fichier d'en-tête...

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par PyNub Voir le message
    si je fais comme ça le type de données , par exemple, n'est plus reconnu et j'ai une erreur de compilation...
    Ben oui parce que dans tes fichiers d'en-têtes tu dois mettre le nom complet des membres soit std::fstream et pas fstream seul. Et tout fonctionnera.

    Le "using namespace std" n'est jamais obligatoire, y compris dans un cpp. Ca peut servir de raccourci, c'est tout.
    Find me on github

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Points : 149
    Points
    149
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Pour les types, en revanche, on ne peut connaître leur taille que si on connaît leur définition.
    Par conséquent, lorsque l'on utilise un type, il faut impérativement inclure (directement ou indirectement) le fichier d'en-tête dans lequel il est défini.
    En particulier lorsque cette utilisation a lieu dans un fichier d'en-tête...
    Très bien, merci. en effet l'utilisation d'un type nécessite l'inclusion du fichier d'entête dans le fichier d'entête qui l'utilise. Je pensais que inclure dans le fichier source le fichier d'entête du type puis le fichier d'entête qui utilise le type suffisait...

    C'est surtout using namespace std; qui me pose problème. Je regarde la FAQ.
    Merci !
    "Bien qu'on ait du coeur à l'ouvrage,
    L'Art est long et le Temps est court." - CB

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Points : 149
    Points
    149
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Ben oui parce que dans tes fichiers d'en-têtes tu dois mettre le nom complet des membres soit std::fstream et pas fstream seul. Et tout fonctionnera.

    Le "using namespace std" n'est jamais obligatoire, y compris dans un cpp. Ca peut servir de raccourci, c'est tout.
    Oui en effet je pense que ce type de notation doit résoudre pas mal de problème concernant les espaces de nommage. mais dans le bouquin que je lis en ce moment je ne suis pas encore a ce type de déclaration je pense que c'est prévu dans les prochains chapitre (j'ai apperçu les passage concernés) ceci dit je vais essayer.

    Merci
    "Bien qu'on ait du coeur à l'ouvrage,
    L'Art est long et le Temps est court." - CB

  9. #9
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par PyNub Voir le message
    Oui en effet je pense que ce type de notation doit résoudre pas mal de problème concernant les espaces de nommage. mais dans le bouquin que je lis en ce moment je ne suis pas encore a ce type de déclaration je pense que c'est prévu dans les prochains chapitre (j'ai apperçu les passage concernés) ceci dit je vais essayer.
    C'est pourtant trivial ! Et c'est pas une histoire de résoudre des problèmes. C'est une histoire de coder proprement. Si tu as besoin d'un namespace pour inclure un fichier d'en-tête, cela signifie que l'en-tête n'est pas auto-portant et ce n'est pas correct. Il suffit de rajouter la syntaxe que je t'ai montrée, et rien d'autre. Pas besoin d'un bouquin pour ça
    Find me on github

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    280
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 280
    Points : 149
    Points
    149
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    C'est pourtant trivial ! Et c'est pas une histoire de résoudre des problèmes. C'est une histoire de coder proprement. Si tu as besoin d'un namespace pour inclure un fichier d'en-tête, cela signifie que l'en-tête n'est pas auto-portant et ce n'est pas correct. Il suffit de rajouter la syntaxe que je t'ai montrée, et rien d'autre. Pas besoin d'un bouquin pour ça
    Oui je comprends ce que tu veux dire... L'auteur du livre (Eckel) a surement voulu rendre son livre attractif en ne parlant pas de ce point (bien qu'il l'évoque dès le premier chapitre) dès le début et en donnant le moyen au lecteur de pouvoir rentrer dès le début dans la création de classes et remettre à plus tard certaines notions sur les délaration.

    Personnellement je préfère aussi apprendre à coder proprement dès le début, c'est ce que j'ai fait avec le C (je ne remercierai d'ailleurs jamais assez certains contributeurs de ce forum pour leur aide à ce sujet) et j'ai une meilleure apréhension de ce dernier langage. Avec le C++ il y a des choses qui m'échappe encore...
    "Bien qu'on ait du coeur à l'ouvrage,
    L'Art est long et le Temps est court." - CB

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

Discussions similaires

  1. [Flash8] Espace de nommage dans un webservice
    Par memess dans le forum Flash
    Réponses: 1
    Dernier message: 01/03/2007, 09h19
  2. [c++] Mettre un callback dans un espace de nommage ou une class
    Par Spartan03 dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 20/01/2007, 16h12
  3. Réponses: 2
    Dernier message: 05/09/2006, 10h08
  4. L'espace de nommage
    Par Shakan972 dans le forum C++
    Réponses: 1
    Dernier message: 02/11/2005, 15h49
  5. Réponses: 3
    Dernier message: 10/01/2005, 12h21

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