Partager via


Espaces de noms (C++)

Le langage C++ fournit un espace de noms unique et global. Cela peut entraîner des problèmes avec les conflits de noms globaux. Par exemple, considérez ces deux fichiers C++ d'en-tête :

char func(char);
class String { ... };

// somelib.h
class String { ... };

Avec ces définitions, il est impossible d'utiliser les deux fichiers d'en-tête dans un seul programme ; les classes String s'opposeront.

Un espace de noms est une zone déclarative qui associe un identificateur supplémentaire pour tous les noms déclarés à l'intérieur. L'identificateur supplémentaire rend moins probable le fait qu'un nom est en conflit avec les noms déclarés ailleurs dans le programme. Il est possible d'utiliser le même nom dans des espaces de noms distincts sans conflit même si les noms apparaissent dans la même unité de traduction. Tant qu'ils apparaissent dans des espaces de noms distincts, chaque nom sera unique en raison de l'ajout de l'identificateur de l'espace de noms. Par exemple :

namespace one {
   char func(char);
   class String { ... };
}

// somelib.h
namespace SomeLib {
   class String { ... };
}

Maintenant les noms de classe ne s'opposeront pas car ils sont devenus respectivement one::String et SomeLib::String.

C++ n'autorise pas les noms composés pour les espaces de noms.

// pluslang_namespace.cpp
// compile with: /c
// OK
namespace a {
   namespace b {
      int i;
   }
}

// not allowed
namespace c::d {   // C2653
   int i;
}

Les déclarations dans la portée du fichier d'une unité de traduction, hors de tous les espaces de noms, sont toujours des membres de l'espace de noms global.

Sur quels éléments souhaitez-vous obtenir des informations supplémentaires ?

Voir aussi

Référence

Déclarations