IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

FAQ C++Consultez toutes les FAQ

Nombre d'auteurs : 34, nombre de questions : 368, dernière mise à jour : 14 novembre 2021  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.

Je tiens à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur ou si vous souhaitez devenir rédacteur, lisez ceci.

Sur ce, nous vous souhaitons une bonne lecture.

SommaireLes namespaces (5)
précédent sommaire suivant
 

Un namespace, ou espace de nom (parfois aussi espace de nommage, voire référentiel lexical) est une zone de déclaration d'identificateurs permettant au compilateur de résoudre les conflits de noms.
Si, par exemple, deux développeurs définissent des fonctions avec le même nom, il y aura un conflit lors de l'utilisation de ces fonctions dans un programme. Les espaces de nommage permettent de résoudre ce problème en ajoutant un niveau supplémentaire aux identificateurs.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace a 
{ 
    void toto() // première fonction toto 
    { 
    } 
} 
namespace b 
{ 
    void toto() // seconde fonction toto() 
    { 
    } 
} 
a::toto(); // appelle la première 
b::toto(); // appelle la seconde
Les namespaces offrent une alternative élégante à diverses techniques prénamespace telles que le préfixage des noms ou l'utilisation de préprocesseur :

Code c++ : Sélectionner tout
1
2
void mylib_fonction1(); 
void mylib_fonction2();
L'exemple précédent peut s'écrire ainsi grâce aux namespaces :

Code c++ : Sélectionner tout
1
2
3
4
5
namespace mylib 
{ 
    void fonction1(); 
    void fonction2(); 
}

Mis à jour le 22 novembre 2004 Aurelien.Regat-Barrel JolyLoic LFE

Un namespace anonyme est un espace de nom… sans nom.

Code c++ : Sélectionner tout
1
2
3
4
namespace 
{ 
    int a; // variable déclarée dans un namespace anonyme 
}
Un namespace anonyme a la particularité de n'être visible que par l'unité de compilation dans laquelle il se trouve (c'est-à-dire le fichier compilable). Son utilité est de permettre la déclaration d'une variable / fonction / type dont la portée doit être celle du fichier.
Parce qu'un namespace traduit mieux la notion de portée restreinte à un fichier, il est recommandé de privilégier son usage en C++ par-rapport à celui du mot-clé static utilisé dans le même but mais en C.

Mis à jour le 22 novembre 2004 Aurelien.Regat-Barrel

Si vous avez déclaré une classe ou des fonctions dans un espace de nom :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
namespace ns 
{ 
    class Test 
    { 
    public: 
        void F1(); 
        void F2(); 
    }; 
  
    void Fonction1(); 
    void Fonction2(); 
}
Il suffit de procéder de la même manière pour les implémenter, ou bien de préfixer par le nom du namespace :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace ns 
{ 
    void Test::F1() 
    { 
    } 
  
    void Fonction1() 
    { 
    } 
} 
  
// autre possibilité 
  
void ns::Test::F2() 
{ 
} 
  
void ns::Fonction2() 
{ 
}

Mis à jour le 22 novembre 2004 Aurelien.Regat-Barrel LFE Luc Hermitte

Toute la bibliothèque standard C++ est définie dans son propre espace de nom, le namespace std. Ainsi, il faut systématiquement utiliser le préfixe std:: devant tous les éléments qui en sont issus.

Code c++ : Sélectionner tout
1
2
3
4
5
#include <iostream> 
  
int main() 
    std::cout << "cout" << std::endl; 
}
Pour alléger l'écriture, on utilise l'expression using namespace std; ce qui permet de s'affranchir de l'obligation de préfixer par std::. Le code précédent peut alors s'écrire ainsi :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
#include <iostream> 
using namespace std; 
  
int main() 
{ 
    cout << "coucou" << endl; 
}
Il est conseillé de limiter l'utilisation de using namespace car cela fait tout simplement perdre l'utilité des namespaces. En particulier, son usage est à proscrire dans les fichiers d'en-tête, ainsi que dans les cas où il génère des conflits avec d'autres namespaces. On peut pour cela restreindre la portée de la clause using à un bloc en particulier :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream> 
  
void affiche_coucou() 
{ 
    using namespace std; 
    // dans tout le corps de la fonction préfixer par std:: est facultatif 
  
    cout << "coucou" << endl; 
} 
  
int main() 
{ 
    // ici il est obligatoire de préfixer par std:: 
    affiche_coucou(); 
    std::cout << "coucou" << std::endl; 
}
Autre possibilité : importer un symbole du namespace et non le namespace tout entier :

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
#include <iostream> 
  
using std::cout; 
using std::endl; 
  
int main() 
{ 
    // si on veut utiliser cin par exemple, il faudra écrire std::cin 
    cout << "coucou" << endl; 
}
Pour plus d'informations, lire Qu'est-ce qu'un namespace ?.

Mis à jour le 22 novembre 2004 Anomaly Aurelien.Regat-Barrel Luc Hermitte

Utiliser using namespace xxx; indique au compilateur qu'il a le droit, quand il voit un nom dans le reste de la portée courante, de le rechercher dans l'espace de nom xxx, ce qui peut alléger le code, en permettant d'écrire :

Code c++ : Sélectionner tout
1
2
3
using namespace std; 
  
cout << hex << 42 << endl;
Au lieu de

Code c++ : Sélectionner tout
std::cout << std::hex << 42 << std::endl;
Pour plus de détails, voir À quoi sert « using namespace std; » ?.

Par contre, cette écriture est à proscrire dans des fichiers d'en-tête, du moins à portée de fichier. En effet, le but des espaces de nom est de permettre d'éviter des collisions de nom entre deux objets qui auraient le même nom, mais provenant de deux sources différentes (et donc classés dans deux espaces de nom différents). L'utilisation de using est un raccourci, mais il n'est possible que si on sait qu'il n'y a pas de conflits. Si ce n'est pas le cas, il faut obligatoirement utiliser le nom qualifié des objets.

Or, dans le cadre d'un fichier d'en-tête, on ne peut pas savoir dans quels contextes ce fichier sera utilisé. Et comme il n'existe pas de commande qu'on puisse insérer pour dire d'arrêter d'utiliser un using, on risque si on utilise cette écriture dans un fichier d'en-tête de provoquer un conflit chez un de ses clients, qui n'aura aucun recours pour le corriger.

Mis à jour le 3 février 2007 JolyLoic

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.