He notado que en varios sitios de internet no usan la linea mencionada al principio, es más, desaconsejan usar using namespace std
y mi duda es ¿por qué la desaconsejan y a que se debe?
- 2,165
- 8
- 19
- 372
- 1
- 4
- 21
2 Answers
Poner en tu código using namespace [ALGO]
implica que el compilador va a coger todo lo que exista en ese espacio de nombres y lo va a importar al espacio de nombres global.
Si bien es una herramienta que puede mejorar bastante la legibilidad, sobretodo al hacer uso de clases y funciones que se encuentran en espacios de nombres anidados, lo cierto es que es una característica a usar con cierta cautela.
Por otro lado hay que destacar que hacer uso de los espacios de nombre permite al que revisa el código a posteriori saber con bastante precisión qué funciones y clases se están usando.
¿Qué peligros puede ocasionar?
Imagínate el siguiente escenario:
namespace A
{
void func()
{ std::cout << "A::func()" << std::endl; }
}
namespace B
{
void func()
{ std::cout << "B::func()" << std::endl; }
}
using namespace A;
using namespace B;
void func()
{ std::cout << "func()" << std::endl; }
int main()
{
A::func(); // imprime A::func()
B::func(); // imprime B::func()
func(); // ¿Qué sucede aquí?
}
Una situación como esta (de compilar) puede hacer que acabes llamando a una función que no quieres y este tipo de problemas son bastante complicados de localizar.
El problema no es usar using namespace
sino no tener claras sus implicaciones. using namespace
importa un espacio de nombres pero la importación únicamente es vigente durante la unidad de compilación actual. Esto dicho en cristiano quiere decir lo siguiente:
- Si se incluye dentro de una función el espacio de nombres se importará solo dentro de dicha función.
- Si se incluye dentro de un CPP la importación existirá únicamente en dicho fichero.
- Si se incluye dentro de un fichero de cabecera la importación se extenderá a todo fichero que incluya dicha cabecera.
Dado que el uso de using namespace
puede ser delicado lo más recomendable es reducir al máximo su influencia para tener el mayor control posible sobre aquello que estás importando.
Como norma general yo diría que su uso está totalmente desaconsejado en ficheros de cabecera, ya que obligar a que todo aquel que incluya dicho fichero tenga que importar porque sí una serie de espacios de nombre es poco menos que una aberración a la par que peligroso.
En lo referente a la importación en ficheros de implementación (CPP), si bien se requiere cierta moderación, es un poco a gusto del programador.
En líneas generales, y ya por resumir, podríamos decir que en proyectos pequeños puede ser práctico pero también es cierto que su uso se empieza a desaconsejar conforme el proyecto va ganando complejidad.
Un saludo.
- 49,291
- 5
- 30
- 72
Se desaconseja using namespace std
porque problemas pueden occurir si hay conflictos en los funciones que se usan el namespace. Por ejemplo si tu usas el namespace std
y tambien defines una function se llama cout
en tu proyecto, vas a tener problemas cuando intentas a llamar:
cout << "hola stackoveflow" << endl;
Porque sera un conflicto entre tu funcion que se llama cout
y la funcion en el namespace std
que se llama cout
.
Eso es porque debes usar std::cout
. Esta practica tiene mas importancia cuando trabajas con un equipo grande. Por ejemplo, si otra persona define una funcion en un namespace que tu usas y tu defines una funcion con la misma nombre va ser un conflico.
- 136
- 4
-
`std::endl` debería usarse sólo excepcionalmente. – Sep 13 '16 at 12:17
-
normalmente uso `#include
` en mis programas y actualmente no he tenido ningun problema.¿podrias explicarte mas detalladamente para entender tu punto de vista? – bassily Sep 13 '16 at 21:49