namespace how declarations create c++ namespaces using-directives

declarations - how to use namespace in c++



C++: ¿Debo usar ''typedef'' o ''using namespace''? (4)

La forma más clara es no usar ninguno de esos métodos, solo escriba new project1::namespace1::class1() .

Estoy escribiendo una biblioteca con varios módulos dependientes. Cuando incluyo un archivo de un módulo diferente, ¿debo resolver el espacio de nombres con:

using namespace project1::namespace1; class1 obj;

o

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

¿Cuáles son los pros / contras de cada enfoque? Leí en alguna parte que deberíamos usar typedef en archivos .H y using archivos .C, ¿es aconsejable?

Un problema que he encontrado con ''typedef'' es que conduce a la ambigüedad del espacio de nombres si incluyo tanto la clase original como la clase con ''typedef'' en un tercer módulo.


Las dos opciones que declaras no son equivalentes. Éste:

using namespace project1::namespace1;

atrae todo desde el espacio de nombres, lo que le da poco control y hace posibles los enfrentamientos. Solo veo inconvenientes, y no hay profesionales aquí.

Pero no necesita usar un typedef para traer un solo símbolo, puede usar

using project1::namespace1::class1;

Si usas esto o el typedef no hace mucha diferencia. Pero tenga en cuenta que typedef está limitado a tipos y enumeraciones, mientras que el using puede referirse a valores, funciones, 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

entonces las dos expresiones no son completamente equivalentes.


Nunca debe usar using o typedef en un archivo de encabezado solo por hacer que los nombres sean más fáciles de escribir .

En el archivo fuente, depende de usted. Parece una buena práctica escribir el nombre completo, ya que deja muy en claro lo que usted quiso decir. Si su espacio de nombres es demasiado largo, puede usar un alias de espacio de nombres para reducir el desorden, pero aún así mantener el significado claro: namespace ns = project1::namespace1;

De cualquier manera, si va a importar símbolos en el espacio de nombres global, use using , no typedef . typedef se usa principalmente cuando desea llamar al tipo con un nombre diferente, muchas veces porque es una plantilla, por ejemplo, my_map lugar de std::map<std::string, my_type> , que sigue siendo claro, pero mucho más agradable de escribir.

Además, vea esta pregunta: ¿Por qué "usar el espacio de nombres estándar" se considera una mala práctica?


usar using project1::namespace1::class1

O bien, puede limitar su uso de namespce en un ámbito local, tanto para su conveniencia como para no contaminar el espacio de nombres global.

void function() { using namespace project1::namespace1; class1 obj; ... }