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:

namespace namespace_name { // Declaración de código }

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:

name::code; // code puede ser una variable o una función

Veamos cómo el espacio de nombres define el ámbito para entidades como variables o funciones:

Ejemplo

#include <iostream> using namespace std; // Primer espacio de nombres namespace first_space{ void func(){ cout << "Inside first_space" << endl; } } // Segundo espacio de nombres namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } int main () { // Llamar a la función en el primer espacio de nombres first_space::func(); // Llamar a la función en el segundo espacio de nombres second_space::func(); return 0; }

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

#include <iostream> using namespace std; // Primer espacio de nombres namespace first_space{ void func(){ cout << "Inside first_space" << endl; } } // Segundo espacio de nombres namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } using namespace first_space; int main () { // Llamar a la función en el primer espacio de nombres func(); return 0; }

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

#include <iostream> using std::cout; int main () { cout << "std::endl is used with std!" << std::endl; return 0; }

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:

namespace namespace_name { // Declaración de código }

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:

namespace namespace_name1 { // Declaración de código namespace namespace_name2 { // Declaración de código } }

Puede, mediante el uso del operador::, acceder a los miembros del espacio de nombres anidado:

// Acceder a los miembros de namespace_name2 using namespace namespace_name1::namespace_name2; // Acceder a los miembros de namespace_name1 using namespace namespace_name1;

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

#include <iostream> using namespace std; // Primer espacio de nombres namespace first_space{ void func(){ cout << "Inside first_space" << endl; } // Segundo espacio de nombres namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } } using namespace first_space::second_space; int main () { // Llamar a la función en el segundo espacio de nombres func(); return 0; }

Cuando el código anterior se compila y se ejecuta, produce los siguientes resultados:

Inside second_space
Otras extensiones