C++Espaces de noms


Introduction

Utilisé pour empêcher les collisions de noms lors de l'utilisation de plusieurs bibliothèques, un espace de noms est un préfixe déclaratif pour les fonctions, les classes, les types, etc.

Syntaxe

  • identifiant d' espace de noms ( opt ) { declaration-seq }
  • identificateur d' espace de nommage en ligne ( opt ) { declaration-seq } / * depuis C ++ 11 * /
  • inline ( opt ) namespace attribut-spécificateur-seq identifiant ( opt ) { declaration-seq } / * depuis C ++ 17 * /
  • espace de noms enclosing-namespace-specifier :: identifier { declaration-seq } / * depuis C ++ 17 * /
  • identifiant d' espace de nommage = spécificateur-espace-nom qualifié ;
  • using namespace-name-spécificateur imbriqué (opt) namespace-name;
  • attribute-specifier-seq utilisant un espace de nommage nom-nom-spécificateur ( opt ) nom-espace ; / * depuis C ++ 11 * /

Remarques

L' namespace mot clé a trois significations différentes selon le contexte:

  1. Lorsqu'il est suivi d'un nom facultatif et d'une séquence de déclarations entourée d'accolades, il définit un nouvel espace de noms ou étend un espace de noms existant avec ces déclarations. Si le nom est omis, l'espace de noms est un espace de noms sans nom .

  2. Lorsqu'il est suivi d'un nom et d'un signe égal, il déclare un alias d'espace de noms .

  3. Lorsqu'elle est précédée par l' using et le suivi d'un nom d'espace de noms, elle forme une directive using , qui permet aux noms dans l'espace de noms donné d'être trouvés par une recherche de noms non qualifiée (mais ne les redéclarent pas dans la portée actuelle). Une directive using ne peut pas exister à la portée de la classe.

using namespace std; est découragé. Pourquoi? Parce que l' namespace std est énorme! Cela signifie qu'il y a de fortes chances que les noms entrent en collision:

//Really bad!
using namespace std;

//Calculates p^e and outputs it to std::cout
void pow(double p, double e) { /*...*/ }

//Calls pow
pow(5.0, 2.0); //Error! There is already a pow function in namespace std with the same signature,
               //so the call is ambiguous

Espaces de noms Exemples Liés