C++ Espacios de nombres
Supongamos una situación en la que hay dos estudiantes llamados Zara en una clase. Para distinguirlos claramente, además de usar sus nombres, tenemos que usar información adicional, como su dirección familiar o el nombre de sus padres, etc.
La misma situación se da en las aplicaciones C++. Por ejemplo, puede que escriba una función llamada xyz(), y en otra biblioteca disponible también existe una función idéntica xyz(). Así, el compilador no puede determinar cuál de las funciones xyz() está utilizando.
Por lo tanto, se introduceel espacio de nombres, un concepto diseñado específicamente para resolver el problema anterior. Sirve como información adicional para distinguir funciones, clases, variables, etc., con el mismo nombre en diferentes bibliotecas. Usar un espacio de nombres define un contexto. En esencia, un espacio de nombres define un ámbito.
Pongamos un ejemplo de un sistema informático: una carpeta (directorio) puede contener varias carpetas. Dentro de cada carpeta no puede haber archivos con el mismo nombre, pero los archivos en diferentes carpetas sí pueden tener el mismo nombre.

Definir un espacio de nombres
La definición de un espacio de nombres utiliza la palabra clavenamespace, seguida del nombre del espacio de nombres, como se muestra a continuación:
Para llamar a una función o variable con espacio de nombres, debe anteponerse el nombre del espacio de nombres, como se muestra a continuación:
Veamos cómo el espacio de nombres define el ámbito para entidades como variables o funciones:
Ejemplo
Cuando el código anterior se compila y se ejecuta, produce los siguientes resultados:
Inside first_space Inside second_space
La directiva using
Puede usar lausing namespacedirectiva, de modo que al usar el espacio de nombres no sea necesario anteponer el nombre del espacio de nombres. Esta directiva le indica al compilador que el código posterior usará los nombres del espacio de nombres especificado.
Ejemplo
Cuando el código anterior se compila y se ejecuta, produce los siguientes resultados:
Inside first_space
La directiva using también se puede utilizar para especificar elementos concretos del espacio de nombres. Por ejemplo, si solo desea usar la parte cout del espacio de nombres std, puede usar una declaración como la siguiente:
using std::cout;
En el código posterior, al usar cout no es necesario anteponer el nombre del espacio de nombres, perostdlos demás elementos del espacio de nombres todavía deben llevar el nombre del espacio de nombres como prefijo, como se muestra a continuación:
Ejemplo
Cuando el código anterior se compila y se ejecuta, produce los siguientes resultados:
std::endl is used with std!
usingLos nombres introducidos por la directiva siguen las reglas normales de ámbito. El nombre es visible desde el uso de lausingdirectiva hasta que finaliza ese ámbito. En ese momento, las entidades con el mismo nombre definidas fuera del ámbito quedan ocultas.
Espacios de nombres discontinuos
Un espacio de nombres puede definirse en varias partes diferentes, por lo que está compuesto por varias secciones definidas por separado. Los distintos componentes de un espacio de nombres pueden estar distribuidos en varios archivos.
Por lo tanto, si un componente del espacio de nombres necesita hacer referencia a un nombre definido en otro archivo, aún debe declarar ese nombre. La siguiente definición de espacio de nombres puede definir un espacio de nombres nuevo o agregar nuevos elementos a un espacio de nombres existente:
Espacios de nombres anidados
Los espacios de nombres se pueden anidar. Puede definir otro espacio de nombres dentro de uno, como se muestra a continuación:
Puede, mediante el uso del operador::, acceder a los miembros del espacio de nombres anidado:
En la declaración anterior, si se usa namespace_name1, los elementos de namespace_name2 también están disponibles dentro de ese ámbito, como se muestra a continuación:
Ejemplo
Cuando el código anterior se compila y se ejecuta, produce los siguientes resultados:
Inside second_spaceOtras extensiones