2011-03-29 14 views
9

Duplicar posible:
Why is 'using namespace std;' considered a bad practice in C++?¿Por qué std :: es utilizado por codificadores experimentados en lugar de utilizar namespace std ;?

El otro día, cuando hice una pregunta que alguien respondió diciendo que si alguien hace una pregunta, mostrarles el camino correcto para hacerlo en lugar de using namespace std; cual pensamiento era un poco raro, como using namespace std; es manera más fácil, pero supongo que estoy fallando ahora ya que soy un codificador 'principiante' y ustedes saben mejor.

Supongo que mi pregunta es: ¿Por qué std:: en lugar de using namespace std;?

Gracias.

+2

Ver http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c – Sapph

Respuesta

20

De C++ FAQ:

¿Debo usar using namespace std en mi código?

Probablemente no.

gente no le gusta escribir sobre std:: y otra vez, y descubren que using namespace std permite ver el compilador cualquier nombre std, incluso si no calificado. El vuela en esa pomada es que permite que el compilador vea cualquierstd nombre, incluso los que no pensó. En es decir, puede crear conflictos y ambigüedades de nombre .

https://isocpp.org/wiki/faq/coding-standards#using-namespace-std

+0

+ !: Buena cita, lo dice todo. –

+1

¿Hay algún aumento de eficiencia o no es un problema? – chustar

+0

@chustar: ¿Qué quiere decir con "eficiencia"? –

0

espacio de nombre (s) son calificadores adicionales para nuestras variables. Digamos que tenemos 'cadena' definida en std y ahora si definimos una 'cadena' en mynamespace también.

Ahora, si escribo using namespace std; en la parte superior de un archivo, a partir de ahí una cadena se vuelve ambigua para un compilador.

Sin embargo, se puede tener un enfoque medio, estrictamente no tener using namespace std; en un archivo de encabezado (.h), ya que otros pueden querer usar su clase y pueden obtener conflictos. Mientras que para un archivo de implementación (.cxx), puede tener cuidado de usarlo si está seguro de que no habrá conflictos.

4

En pocas palabras, es menos probable que utilice los tipos o funciones incorrectos por error o conflictos de nombre. Digamos que está utilizando su propia biblioteca de matemáticas, más std, y declara usar ambas, en un orden arbitrario. Ahora, ambos definen la función pow. ¿Qué pow estás usando cuando invocas pow? Creo que vale la pena escribir más.

2

No creo que los programadores más experimentados usen espacios de nombres explícitos, ver p.Do you prefer explicit namespaces or 'using' in C++?

Nota sin embargo que nunca se debe importar los espacios de nombres de archivos de cabecera y que en algunos casos los espacios de nombres explícitos son más claras, por ejemplo, con las funciones y std::min()std::max()

1

Creo que es un poco de lo que una cosa preferencia. A algunas personas les gusta ver los espacios de nombres explícitos cuando usan las clases. Una excepción es que nunca debo usar un espacio de nombres estándar en un archivo de encabezado. Como esto puede cambiar inesperadamente el comportamiento de una clase que está usando este archivo de encabezado.

0

Los programadores experimentados usan lo que resuelve sus problemas y evitan lo que crea nuevos problemas.

Por lo tanto, evitan las directivas de uso de nivel de archivo de cabecera por razones obvias.

Y tratan de evitar la calificación completa de los nombres dentro de sus archivos fuente. El punto menor es que no es elegante escribir más código cuando menos código es suficiente sin una buena razón. El punto principal es apagar ADL.

¿Cuáles son estas buenas razones ? En ocasiones, explícitamente deseas desactivar ADL. En algún momento quieres desambiguar.

Así que los siguientes son correctos: 1) directivas de uso de nivel de función y declaraciones de uso dentro de las implementaciones de funciones; 2) declaraciones de uso de nivel de archivo fuente dentro de archivos fuente; 3) (a veces) directivas de uso de nivel de archivo fuente.

Cuestiones relacionadas