2.3.2. Espacios de nombres

Como se menciona en el Capítulo 1, uno de los problemas del lenguaje C es que «nos quedamos sin nombres» para funciones e identificadores cuando los programas llegan a ser de cierto tamaño. Por supuesto que realmente no nos quedamos sin nombres; aunque se hace más difícil pensar en nombres nuevos después de un rato. 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 un ruedo para lidiar con 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 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 escribe un fichero de cabecera y usa algunas funciones u objetos de esa cabecera, probablemente reciba extraños mensajes cuando compile el programa, debido a que el compilador no pueda encontrar las declaraciones de los elementos del 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 sin 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 ha molestado en ocultarlos, parece contraproducente, y de hecho, el lector deberá tener cuidado si considera hacerlo (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 pienselo dos veces antes de usarlo en un fichero cabecera, eso es temerario).

Existe una relación entre los espacios de nombres y el modo en que se incluyes los ficheros de cabecera. Antes de que se estandarizara la nueva forma de inclusión de los ficheros 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 haciendo explícita la directiva using.

Por ahora, esto es todo lo que necesita saber sobre los espacios de nombres, pero el Capítulo 10 cubre esta materia en profundidad.