À QUOI ÇA SERT ?
Un gros programme utilise énormément de noms :
- fonctions ;
- classes ;
- variables ;
- constantes ;
- structures.
Sans mécanisme de séparation, cela créerait des conflits.
Le namespace existe principalement pour organiser et séparer les noms.
1. PROBLÈME SANS NAMESPACE
Supposons que tu veuilles avoir :
Code: Select all
void connect();
Et également :
Code: Select all
void connect();
Si elles ont exactement la même signature dans la même portée, tu as un conflit.
Avec des namespaces :
Code: Select all
namespace Network
{
void connect()
{
// connexion réseau
}
}
namespace Database
{
void connect()
{
// connexion base de données
}
}
Code: Select all
Network::connect();
Database::connect();
2. :: — OPÉRATEUR DE RÉSOLUTION DE PORTÉE
Dans :
Code: Select all
Network::connect();
"cherche connect dans la portée Network".
Même chose avec :
Code: Select all
std::cout
std::vector
std::string
Donc :
Code: Select all
std::vector
"le symbole vector situé dans le namespace std".
3. NAMESPACES IMBRIQUÉS
Pour organiser un gros projet :
Code: Select all
namespace MyProgram::Network::TCP
{
void connect()
{
}
}
Code: Select all
MyProgram::Network::TCP::connect();
Imagine un projet système :
Code: Select all
MyOS::Memory::allocate()
MyOS::Memory::free()
MyOS::Process::create()
MyOS::Process::terminate()
MyOS::Network::send()
4. ALIAS DE NAMESPACE
Si un namespace est trop long :
Code: Select all
namespace net = MyProgram::Network::TCP;
Code: Select all
net::connect();
C’est seulement un autre nom pour le namespace existant.
5. using
On peut importer un nom précis :
Code: Select all
using std::string;
string name{"Jean"};
Code: Select all
std::string name{"Jean"};
Pour raccourcir des noms très utilisés sans importer tout un namespace.
6. using namespace
On peut écrire :
Code: Select all
using namespace std;
Code: Select all
cout << "Hello";
string text;
vector<int> values;
Dans un petit exercice ce n’est pas dramatique.
Dans un gros projet, cela peut provoquer des collisions.
Exemple :
Code: Select all
namespace A
{
void print();
}
namespace B
{
void print();
}
using namespace A;
using namespace B;
print(); // ambigu
Code: Select all
using namespace std;
7. PORTÉE
La portée détermine l’endroit où un nom est visible.
Exemple :
Code: Select all
int globalValue{10};
int main()
{
int localValue{20};
}
localValue n’existe que dans main().
8. PORTÉE DE BLOC
Code: Select all
int main()
{
int x{1};
{
int y{2};
}
// y n'existe plus ici
}
La durée de vie de y se termine à la fin du bloc.
C’est fondamental pour RAII.
9. MASQUAGE — SHADOWING
Code: Select all
int value{10};
int main()
{
int value{20};
std::cout << value;
}
La variable locale masque la globale.
Pour accéder à la globale :
Code: Select all
std::cout << ::value;
10. NAMESPACE ≠ MODULE
C’est important.
Namespace :
Code: Select all
namespace Network
{
void connect();
}
Module :
Code: Select all
import NetworkModule;
Tu peux avoir :
- plusieurs namespaces dans un module ;
- le même namespace réparti dans plusieurs fichiers ;
- le même namespace réparti dans plusieurs modules.
MODULE = organisation de compilation.
NAMESPACE = organisation des noms.
À RETENIR
Le namespace répond au problème :
"Comment deux parties du programme peuvent-elles utiliser le même nom sans conflit ?"
Réponse :
Code: Select all
Network::connect();
Database::connect();
Code: Select all
std::
