Namespaces, portée et résolution de noms

Salut ce forum apprends les bases du c++

Moderator: Rick

Post Reply
Hydraxx
Site Admin
Posts: 114
Joined: Mon Jan 12, 2026 4:04 pm
Location: France
Contact:

Namespaces, portée et résolution de noms

Post by Hydraxx »

NAMESPACES ET PORTÉE DES NOMS

À QUOI ÇA SERT ?

Un gros programme utilise énormément de noms :
  • fonctions ;
  • classes ;
  • variables ;
  • constantes ;
  • structures.
Deux bibliothèques peuvent parfaitement avoir toutes les deux une fonction appelée connect().

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();
pour le réseau.

Et également :

Code: Select all

void connect();
pour une base de données.

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
    }
}
Tu peux maintenant écrire :

Code: Select all

Network::connect();
Database::connect();
Le compilateur sait exactement de quelle fonction tu parles.


2. :: — OPÉRATEUR DE RÉSOLUTION DE PORTÉE


Dans :

Code: Select all

Network::connect();
:: signifie :

"cherche connect dans la portée Network".

Même chose avec :

Code: Select all

std::cout
std::vector
std::string
std est le namespace de la bibliothèque standard.

Donc :

Code: Select all

std::vector
signifie :

"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()
    {
    }
}
Appel :

Code: Select all

MyProgram::Network::TCP::connect();
Pourquoi faire cela ?

Imagine un projet système :

Code: Select all

MyOS::Memory::allocate()
MyOS::Memory::free()
MyOS::Process::create()
MyOS::Process::terminate()
MyOS::Network::send()
La structure devient beaucoup plus lisible.


4. ALIAS DE NAMESPACE


Si un namespace est trop long :

Code: Select all

namespace net = MyProgram::Network::TCP;
Puis :

Code: Select all

net::connect();
Cela ne crée pas un nouveau namespace.

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"};
Au lieu de :

Code: Select all

std::string name{"Jean"};
Pourquoi cela peut être utile ?

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;
Puis :

Code: Select all

cout << "Hello";
string text;
vector<int> values;
Mais cela importe énormément de noms.

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
Donc en code professionnel, surtout dans les headers, on évite généralement :

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};
}
globalValue est global.

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
}
Le bloc entre accolades crée une portée.

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;
}
Cela affiche 20.

La variable locale masque la globale.

Pour accéder à la globale :

Code: Select all

std::cout << ::value;
Le :: sans nom devant désigne la portée globale.


10. NAMESPACE ≠ MODULE


C’est important.

Namespace :

Code: Select all

namespace Network
{
    void connect();
}
Son but principal est de séparer les noms.

Module :

Code: Select all

import NetworkModule;
Son but principal est lié à l’organisation de compilation et à l’import d’interfaces.

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.
Donc :

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();
C’est exactement pour cela que tu vois partout :

Code: Select all

std::
dans la bibliothèque standard.

Return to “Bases du C++”

Who is online

Users browsing this forum: No registered users and 0 guests