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 � 2025 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.