Cuando comencé a programar en C++ siempre decían: «coloquen using napespace std
, aunque eso no es tan recomentable, pero para lo que vamos a usar no importa. Después van a aprender para qué sirve», y era extremadamente desesperante para mí no saber qué era o por qué se colocaba esto.
Efectivamente más adelante aprendí por mi cuenta de qué se trataba y no es ningún misterio, incluso es bonito y ayuda mucho. Lo importante es conocer que es un namespace, y como lo dice su traducción a español es un «espacio con nombre». Su importancia se nota más en proyectos grandes donde trabajan muchos programadores y se usan diferentes archivos fuente, ya que es muy probable que dos personas usen la misma palabra para denotar una clase o una función entonces vienen los namespace a salvarle la vida a todos, simplemente agrupan éstos símbolos (clases, funciones, variables) en «espacios con nombre», así puede haber la misma palabra para identificar varios diferentes pero indicando su namespacese puede referir a uno específicamente.
Resumiendo, es como una versión mejorada y con mayor seguridad que el uso de macros para evitar coincidencias como se hace en C, pero creo que con un ejemplo todo se ve más fácil. Imaginemos que tenemos dos archivos cabecera: variables.h
y constantes.h
que vamos a usar en el código principal.
//Archivo cabecera: variables.h
namespace variable {
int x;
int y;
}
//Archivo cabecera: constantes.h
namespace constante {
const int x = 1;
const int z = 2;
}
Vemos que en ambos archivos se encuentran declaradas distintos símbolos con los mismos nombres, pero nótese cómo éstos están dentro de un namespace diferente. Si queremos usar cualquiera de estos símbolos hay que específicar a cuál namespace pertenece y esto es muy sencillo.
//Archivo principal: main.cpp
#include "variables.h"
#include "constantes.h"
int main () {
int a = constante::z;
variable::x = a + constante::x;
variable::y = 21;
return 0;
}
No está de más decir que los namespace deben tener nombres diferentes y dentro de cada uno no pueden repetirse los mismos símbolos.
Muy bonito, pero ¿qué siginifica using namespace std
?
El namespace std
es el espacio con nombre estándar y es donde se encuentran las funciones y clases que trae integradas C++. La palabra reservada using
incorpora «algo» con lo que vamos a trabajar, esto puede ser todo un namespace completo o sólo una variable. Entonces cuando escribimos using napespace std
, el compilador sumirá que estamos trabajando con el espacio global (todo lo que está fuera de cualquier namespace) y el namespace std
así que no hay que anteponer std::
por ejemplo antes de cout
para imprimir por pantalla.
Nos dicen que no es recomentable o peligroso porque si incluímos namespaces a la ligera puede haber coincidendias donde existan dos símbolos iguales en namespaces diferentes, entonces el compilador no sabrá cuál usar, así en el ejemplo anterior si se escribe using namespace variable
, using namespace constante
en el código principal y en una expresión se usa cualquiera de los símbolos declarados en ambos namespaces, aparecerá un fastidioso error de compilación. Viendolo de un punto de vista muy estricto es tonto hacer using namespace std
porque el namespace pierde sentido: ¿para qué voy a agrupar un conjunto de símbolos si al final se usarán junto al espacio global?.
En fin, es cuestión de gusto, comodidad o forma de trabajo. Como puede verse en este último ejemplo, se puede jugar con las instrucciones de diferentes maneras.
//Archivo principal: main.cpp
#include "variables.h"
#include "constantes.h"
#include <iostream>
using namespace constante;
using variable::y;
using std::endl;
int main () {
int a = y;
variable::x = a + z;
y = 21 - x;
std::cout << "Valor de a: " << a << endl;
std::cout << "Valor de variable::x: " << variable::x << endl;
std::cout << "Valor de variable::y: " << y << endl;
std::cout << "Valor de constante::x: " << x << endl;
std::cout << "Valor de constante::z: " << z << endl;
return 0;
}