39 votes

C : Devrais-je utiliser le #39,typedef #39; ou le #39;en utilisant l'espace de nom #39;?

Je suis en train d'écrire une bibliothèque avec plusieurs modules dépendants. Quand j'inclus un fichier à partir d'un autre module, dois-je régler l'espace de noms avec:

using namespace project1::namespace1;
class1 obj;

ou

typedef project1::namespace1::class1 class1;
class1 obj;

Quels sont les avantages/inconvénients de chaque approche? J'ai lu quelque part que nous devrions utiliser typedef dans .H fichiers et using dans .C fichiers, est-ce recommandé?

Un problème que j'ai rencontré avec "typedef" est-il conduit à l'ambiguïté de l'espace de noms, si je comprend à la fois originale de la classe et de la classe avec "typedef" dans un troisième module.

74voto

juanchopanza Points 115680

Les deux options que vous avez de l'état ne sont pas équivalentes. Celui-ci:

using namespace project1::namespace1;

tire dans tout ce à partir de l'espace de noms, vous donnant que peu de contrôle et de décision des affrontements probable. Je ne vois que des inconvénients, et pas des pros ici.

Mais vous n'avez pas besoin d'utiliser un typedef d'apporter un symbole unique, vous pouvez utiliser

using project1::namespace::class1;

Si vous utilisez ce ou de l' typedef ne fait pas trop de différence. Mais gardez à l'esprit qu' typedef est limitée aux types et les énumérations, alors qu' using peut faire référence à des valeurs, des fonctions, etc:

namespace X {
  const int x{42};
  enum Fruit{Apple, Pear};
}

using X::x; // OK
typedef X::x xx; // Error! 'x' in namespace 'X' does not name a type

ainsi, les deux expressions ne sont pas tout à fait équivalents.

9voto

parkovski Points 1044

Vous ne devez jamais utiliser using ou typedef dans un fichier d'en-tête juste pour le plaisir de faire des noms plus facile à taper.

Dans le fichier source, c'est à vous. Il semble être considéré comme une bonne pratique pour écrire le nom en entier, car il est très clair ce que vous voulez dire. Si votre espace de noms est trop long, vous pouvez utiliser un espace de noms d'alias pour réduire l'encombrement, mais toujours garder le sens clair: namespace ns = project1::namespace1;

De toute façon, si vous allez importer des symboles dans l'espace de noms global, utilisez using, pas typedef. typedef est principalement utilisé lorsque vous souhaitez appeler le type par un nom différent, de nombreuses fois, car il s'agit d'un modèle - par exemple, my_map au lieu de std::map<std::string, my_type>, ce qui est encore clair, mais beaucoup plus agréable de type.

Voir également cette question: Pourquoi "using namespace std;" considéré comme une mauvaise pratique en C++?

6voto

ProblemFactory Points 4470

La façon la plus claire n'est pas d'utiliser l'une de ces méthodes - il suffit d'écrire `` .

3voto

Lyn Points 347

Utiliser``

Ou, vous pouvez limiter votre utilisation de namespce dans une portée locale, à la fois pour votre commodité et ne pas polute l'espace de nom global.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X