Como se menciona en el Capítulo 1, uno de los problemas del lenguaje C es que «uno se queda sin nombres» para funciones e identificadores cuando los programas llegan a ser de cierto tamaño. Por supuesto, en realidad uno no se queda sin nombres; aunque se hace más difícil pensar en nombres nuevos pasado un tiempo. Y todavía más importante, cuando un programa alcanza cierto tamaño es normal fragmentarlo en trozos más pequeños cada uno de los cuales es mantenido por diferentes personas o grupos. Como C sólo tiene, en la práctica, un único espacio en el que conviven todos los identificadores y nombres de función, trae como consecuencia que todos los desarrolladores deben tener cuidado de no usar accidentalmente los mismos nombres en situaciones en las que pueden ponerse en conflicto. Esto se convierte rápidamente en una pérdida de tiempo, se hace tedioso y en último término, es más caro.
El C++ Estándar tiene un mecanismo para impedir estas colisiones: la palabra reservada namespace (espacio de nombres). Cada conjunto de definiciones de una librería o programa se «envuelve» en un espacio de nombres, y si otra definición tiene el mismo nombre, pero está en otro espacio de nombres, entonces no se produce colisión.
El espacio de nombres es una herramienta útil y conveniente, pero su presencia implica que debe saber usarla antes de escribir un programa. Si simplemente incluye un fichero de cabecera y usa algunas funciones u objetos de esa cabecera, probablemente reciba extraños mensajes cuando compile el programa, que indican que el compilador no puede encontrar ninguna de las declaraciones de los elementos que acaba de incluir con el fichero de cabecera. Después de ver este mensaje un par de veces se le hará familiar su significado (que es: Usted ha incluido el fichero de cabecera pero todas las declaraciones están dentro de un espacio de nombres y no le dijo al compilador que quería usar las declaraciones en ese espacio de nombres).
Hay una palabra reservada que le permite decir «quiero usar las declaraciones y/o definiciones de este espacio de nombres». Esa palabra reservada, bastante apropiada por cierto, es using. Todas las librerías de C++ Estándar están incluidas en un único espacio de nombres, que es std (por «standard»). Como este libro usa la librería estándar casi exclusivamente, verá la siguiente directiva using en casi todos los programas:
using namespace std;
Esto significa que quiere usar todos los elementos del espacio de nombres llamado std. Después de esta sentencia, ya no hay que preocuparse de si su componente o librería particular pertenece a un espacio de nombres, porque la directiva using hace que el espacio de nombres esté disponible para todo el fichero donde se escribió la directiva using.
Exponer todos los elementos de un espacio de nombres después de que alguien se haya molestado en ocultarlos parece un poco contraproducente, y de hecho, el lector deberá tener cuidado de no hacerlo a la ligera (como aprenderá más tarde en este libro). Sin embargo, la directiva using expone solamente los nombres para el fichero actual, por lo que no es tan drástico como suena al principio. (Pero piénselo dos veces antes de usarlo en un fichero de cabecera, eso es temerario).
Existe una relación entre los espacios de nombres y el modo en que se incluyen los ficheros de cabecera. Antes de que se estandarizara la nueva forma de inclusión de los ficheros de cabecera (sin el «.h» como en <iostream>), la manera típica de incluir un fichero de cabecera era con el «.h» como en <iostream.h>. En esa época los espacios de nombres tampoco eran parte del lenguaje, por lo que para mantener una compatibilidad hacia atrás con el código existente, si se escribía:
#include <iostream.h>
En realidad, significaba:
#include <iostream> using namespace std;
Sin embargo en este libro se usará la forma estándar de inclusión (sin el «.h») y, por tanto, la directiva using debe ser explícita.
Por ahora, esto es todo lo que necesita saber sobre los espacios de nombres, pero el Capítulo 10 cubre esta materia en profundidad.