Pregunta

Al usar los espacios de nombres de C ++, ¿prefieres nombrarlos explícitamente, de esta manera:

std::cout << "Hello, world!\n";

O prefiere usando namespace :

using namespace std;
cout << "Hello, world!\n";

Y si prefiere este último, ¿declara sus usos en el alcance del archivo o función?

Personalmente prefiero nombrarlos explícitamente; es más tipeo, pero cuando se usa una mezcla de espacios de nombres (por ejemplo, std y boost ), me parece más legible.

¿Fue útil?

Solución

Siempre uso usando namespace para std & amp; aumentar. Todo lo demás tiendo a usar un espacio de nombres explícito a menos que se use tanto que desordene el código.

En los encabezados, nunca uso usando namespace para evitar contaminar el espacio de nombres global de la fuente #including.

Otros consejos

La escritura extra no es el problema aquí. El problema con los nombres explícitamente calificados es el desorden visual. Seamos realistas, la sintaxis de C ++ es desordenada. No es necesario empeorar esto haciendo innecesarios los nombres más largos y rociando generosamente el código con :: s.

Estoy con Jeff Atwood: El mejor código es sin código en absoluto . Esto es tan cierto.

Las importaciones de espacios de nombres son una excelente forma de reducir el desorden sin inconvenientes: siempre que el alcance de los espacios de nombres abiertos se reduzca a una sola unidad de compilación 1 , los conflictos de nombres, si aparecen, pueden resolverse. fácilmente.

Por qué los nombres explícitos deben (en general) ser más legibles siempre ha sido un misterio para mí. En general, los lectores deben conocer el código lo suficientemente bien como para poder deducir la semántica. Si no lo son, el código debe ser reparado de todos modos.


1) Corolario: ¡no use en los encabezados!

Yo uso siempre los explícitos. Escribir std no me duele y veo claramente de dónde es. Es útil cuando tienes algún proyecto legado para cuidar con sus propias "cadenas", "vectores" etc para mantener. Cuanta más información contenga el código, mejor.

Mi regla general siempre es usar explícitamente el espacio de nombres en los encabezados, y usualmente usar usar en el código. La razón para el primero es dejarlo explícitamente claro en cada parte de la definición de lo que se está utilizando, y el motivo para el segundo es que facilita el uso de reemplazos de otro espacio de nombres si es necesario. es decir, si queremos comenzar a usar foo :: string en lugar de std :: string, solo necesitamos actualizar el encabezado y la instrucción using en lugar de reemplazar cada instancia de std :: string con foo :: string en el código.

Por supuesto, eso es menos útil para las clases que residen en el espacio de nombres std ::, ya que incluso si reemplaza una clase, es probable que aún use otras en std, y pueda tener problemas de ambigüedad, pero eso fue simplemente un ejemplo.

utilizando y usando namespace son muy muy útiles para hacer que el código sea más legible: elimine el desorden.

Pero en cualquier caso donde sea más difícil averiguar de dónde proviene un símbolo, me niego a importar su espacio de nombres completo.

Intento limitar el alcance de los espacios de nombres importados:

void bar() {

   // do stuff without vector

   { using std::vector;
      // do stuff with vector
   }

   // do stuff without vector
}

Para " generalmente conocido " bibliotecas, como std , me atrevería a usar utilizando namespace std . Hay razones para creer que todos los que lean este código conocen estos símbolos.

Como una nota al margen, la palabra clave using también se usa para indicar que una clase derivada también exporta a los miembros sobrecargados de su superclase.

class A {
  void f( A  );
  void f( bool );
};

class B : public A {
  using A::f; // without this, we get a compilation error in foo()
  void f(bool);
};

void foo() {
  B b;
  b.f( A() ); // here's a compilation error when no `using` is used in B
}

Solo uso espacios de nombres explícitos cuando hay alguna ambigüedad. Es más legible, pero la escritura adicional es demasiado tediosa, y debe asumir que otros desarrolladores tienen un nivel básico de familiaridad con las bibliotecas estándar.

Las únicas otras veces que explico un espacio de nombres es cuando solo lo uso una o dos veces, como agregar una declaración de depuración rápida o si estoy usando una biblioteca no estándar.

Normalmente declaro el espacio de nombres en el ámbito del archivo, pero si está mezclando espacios de nombres, podría tener sentido colocar la declaración más cerca del punto donde se usa, en el ámbito de la función.

usando en el alcance de la función, o si la función es muy pequeña (a menudo lo es), solo espacio de nombres explícito

Tiendo a importar explícitamente los nombres que necesito en la parte superior del archivo .cpp, así que ...

utilizando std :: cout; utilizando std :: endl;

etc ...

De esa manera tengo control sobre los nombres que uso y es fácil ver de dónde vienen y el código no está desordenado en el punto de uso.

En los casos raros en los que estoy usando dos nombres de diferentes espacios de nombres, los califico completamente en el punto de uso.

Siempre uso nombres completos en los encabezados y casi nunca uso 'usar namespace x' en ningún lugar ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top