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.