C ++ succinctement espaces de noms

L'espace de noms global

Jetons un coup d'oeil en regardant un exemple.

Exemple: GlobalNamespaceSample \ GlobalNamespaceSample.cpp

#comprendre  #comprendre  #include "… /pchar.h" int g_x = 10; int AddTwoNumbers (int a, int b) retour a + b;  int _pmain (int / * argc * /, _pchar * / * argv * / []) int y = 20; std :: wcout << L"The result of AddTwoNumbers(g_x, y) where g_x = " << g_x << L" and y = " << y << L" is " << AddTwoNumbers(g_x, y) << L"." << std::endl; if (true == 1)  std::wcout << L"true == 1!" << std::endl;  return 0; 

Dans l'exemple précédent, nous définissons deux fonctions, AddTwoNumbers et wmain. Ces deux fonctions sont toutes deux dans l'espace de noms global. L'espace de noms global est le niveau de base dans lequel tout le reste du programme existe. C ++, en raison de son héritage C, vous permet de définir tout ce qui se trouve dans l'espace de noms global (vous pouvez donc définir des espaces de noms, des classes, des structures, des variables, des fonctions, des énumérations et des modèles)..

C # a également le concept d'un espace de noms global, mais il ne vous permet pas de définir quoi que ce soit en son sein, sauf des espaces de noms et des types. Dans l'exemple précédent, nous avons l'instruction int g_x = 10; qui définit un entier nommé g_x dans l’espace de nom global et lui attribue la valeur 10. C’est ce que l’on appelle couramment une variable globale. En C #, les variables globales sont illégales.

Soit dit en passant, chaque langage de programmation avec lequel j'ai jamais travaillé a eu son lot de mauvaises fonctionnalités - ce que le langage permet, mais des choses qui conduisent généralement à des problèmes. Ces problèmes incluent des problèmes difficiles à déboguer, des erreurs subtiles qui passent inaperçues pendant longtemps, des problèmes de maintenabilité, des problèmes de lisibilité et toutes les autres choses frustrantes qui ajoutent de nombreuses heures au développement sans aucun bénéfice. C ++ n'est pas différent. Lorsque nous rencontrons quelque chose qui correspond à cette description, je ferai de mon mieux pour l'appeler. C'est l'une de ces fois.

Les variables globales sont mauvaises. Évitez-les autant que possible. Il existe une convention commune lors de leur utilisation en C ++, qui consiste à préfixer le nom de la variable avec g_, comme dans l'exemple précédent. Bien que cela aide à vous alerter et à informer les autres programmeurs du fait qu'il s'agit d'une variable globale, cela ne change rien au fait qu'il s'agisse d'une variable globale, avec tous les problèmes que j'ai décrits. Ce n'est pas un livre sur les mauvaises pratiques de programmation, je ne vais donc pas perdre de temps à expliquer pourquoi les variables globales sont mauvaises. Tout ce que vous avez besoin de savoir, c'est que cette fonctionnalité existe en C ++, mais vous devez éviter de l'utiliser autant que possible..


L'opérateur de résolution de portée ::

En C++, :: est l'opérateur de résolution de la portée. Il est utilisé pour séparer les espaces de noms imbriqués, pour séparer les types de leur espace de noms et pour séparer les fonctions membres et les variables de leur type..

Notez qu'il n'est utilisé que dans la dernière situation lorsque vous effectuez les opérations suivantes:

  • Définir une fonction membre.
  • Accéder à un membre d'une classe de base dans une définition de fonction de membre.
  • Accéder à une fonction ou à une variable membre statique.
  • Affectation d'une valeur à une variable membre statique.
  • Récupérer l'adresse d'une fonction membre.

Dans d’autres cas, vous utilisez soit le. opérateur ou l'opérateur ->, selon que vous accédez au membre directement ou via un pointeur.

Cela peut sembler compliqué puisque C # utilise simplement le. opérateur à toutes les fins pour lesquelles ::,., et -> sont utilisés en C++.

Remarque: Nous allons discuter du. et -> opérateurs plus tard. Pour l'instant, il vous suffit de savoir qu'ils sont utilisés pour accéder aux variables de membre d'instance et aux fonctions de membre non statiques (que vous utiliserez selon que vous travaillez ou non avec un pointeur)..

Pour la plupart, tout ira bien. Si vous essayez d'accéder à un membre de la classe de base à l'aide de la touche. opérateur plutôt que l'opérateur :: ou si vous essayez de spécifier un membre enum en utilisant autre chose que ::. Si jamais vous compilez votre programme et recevez une erreur de syntaxe se plaindre de "missing"; ' avant '.' ", c'est un bon pari que vous avez utilisé un. où vous auriez dû utiliser un :: à la place.


Définir les espaces de noms

Un espace de noms est défini de la même manière qu'en C #. Voici un exemple:

Exemple: NamespacesSample \ NamespacesSample.cpp

#comprendre  #comprendre  #comprendre  #include "… /pchar.h" en utilisant namespace std; namespace Places namespace Cities struct City Ville (const wchar_t * name) Name = wstring (name);  wstring Name; ;  int _pmain (int / * argc * /, _pchar * / * argv * / []) auto nyc = Lieux :: Villes :: Ville (L "New York City"); wcout << L"City name is " << nyc.Name.c_str() << L"." << endl; return 0; 

Remarque: Ne jamais inclure une directive using dans un fichier d'en-tête. Si vous faites cela, vous importez non seulement les types et les espaces de noms de cet espace de noms dans le fichier d'en-tête, vous les importez également dans tout fichier source ou en-tête incluant le fichier d'en-tête. Cela cause de vilains problèmes de pollution par les espaces de noms. Nous discuterons ensuite des fichiers d’en-tête, donc tout ce qui n’est pas clair à ce sujet devrait avoir un sens. Rappelez-vous qu’avoir une directive using namespace dans un fichier d’en-tête est une mauvaise idée; utilisez-les uniquement dans vos fichiers de code source.

Conclusion

Comme dans la plupart des langages, les espaces de noms sont importants en C ++ pour tout organiser et éviter les conflits de noms. Dans le prochain épisode de cette série, nous allons nous concentrer sur les fonctions et les classes..

Cette leçon représente un chapitre de C ++ Succinctly, un eBook gratuit de l’équipe de Syncfusion..