Espaces de noms en C++

Jinku Hu 12 octobre 2023
  1. Utilisez le mot-clé namespace pour créer un nouvel espace de noms en C++
  2. Utiliser des espaces de noms imbriqués pour implémenter des portées complexes en C++
Espaces de noms en C++

Cet article explique comment utiliser les espaces de noms en C++.

Utilisez le mot-clé namespace pour créer un nouvel espace de noms en C++

C++ a le concept d’espaces de noms qui aident à éviter un problème commun dans les grands projets appelé conflits de noms. Lorsque le projet donné utilise différentes bibliothèques développées par des équipes indépendantes et a de nombreux noms globaux pour différents objets, il devient inévitable que certains noms correspondent et provoquent des erreurs. L’espace de noms déclare une portée où certains noms de fonctions ou d’autres objets sont définis. N’oubliez pas qu’il existe des règles de portée automatique en C++ qui régissent la façon dont les noms des objets sont vus et disponibles dans différentes régions de code. Par exemple, la variable locale déclarée dans la fonction n’est pas vue ou accessible en dehors du corps de la fonction. Ainsi, une autre variable du même nom peut être déclarée en dehors du corps de cette fonction sans aucun conflit. De l’autre, nous avons une seule portée globale, qui est souvent utilisée par de grands programmes pour rendre certains objets disponibles dans les fichiers ou les fonctions. Maintenant, imaginez comment l’espace peut être géré sans aucun mécanisme de cadrage manuel.

En fait, les programmeurs avaient l’habitude de gérer les collisions de noms en utilisant des noms très longs pour les objets globaux. Cela peut fonctionner pour des projets de taille relativement petite, mais cela rend le code assez compliqué à lire, et la solution ne peut toujours pas empêcher les collisions de noms sans un schéma de nommage coordonné.
Les espaces de noms fournissent un mécanisme pour partitionner une portée globale (appelée par conséquent espace de noms). Un espace de noms est déclaré avec le mot-clé namespace suivi du nom de l’espace de noms lui-même. Suit ensuite le code entre accolades similaire au bloc fonction, et il se termine sans point-virgule. Les mêmes règles de portée automatique régissent les variables dans un espace de noms que les autres parties du code. Les noms d’objets auxquels il est nécessaire d’accéder depuis l’extérieur de l’espace de noms doivent commencer par le nom de l’espace de noms dans lequel ils sont définis, suivi d’une notation double-virgule, puis du nom de l’objet. L’exemple de code suivant illustre le cas d’utilisation de base pour les espaces de noms dans le même fichier.

#include <iostream>

using std::cout;
using std::endl;

namespace dinno {
int var1 = 456;
}

int main() {
  int var1 = 123;

  cout << var1 << endl;
  cout << dinno::var1 << endl;

  return EXIT_SUCCESS;
}

Production:

123
456

Utiliser des espaces de noms imbriqués pour implémenter des portées complexes en C++

Les espaces de noms peuvent être imbriqués, de la même manière que les instructions de boucle. Par défaut, un espace de noms imbriqué a accès aux noms d’objets dans l’espace de noms externe, mais ce dernier (souvent appelé espace de noms parent) ne peut pas accéder aux membres de l’espace de noms interne. Cependant, on peut spécifier le mot-clé inline avant la déclaration d’espace de noms interne pour rendre ses membres accessibles dans l’espace de noms parent. Les espaces de noms peuvent être définis à différents endroits. À savoir, la même définition d’espace de noms peut s’étendre sur différents fichiers ou à des endroits séparés dans un seul fichier, car les espaces de noms dinno sont définis dans l’exemple suivant.

#include <iostream>

using std::cout;
using std::endl;

namespace dinno {
int var1 = 456;
}

namespace gini {
int var1 = 980;

namespace bean {
int var1 = 199;
}
}  // namespace gini

namespace dinno {
int var2 = 990;
}

int var1 = 123;

int main() {
  cout << var1 << endl;
  cout << dinno::var1 << endl;
  cout << gini::var1 << endl;
  cout << dinno::var2 << endl;
  cout << gini::bean::var1 << endl;

  return EXIT_SUCCESS;
}

Production:

123
456
980
990
199
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook