Espacios de nombres en C ++
Considere una situación, cuando tenemos dos personas con el mismo nombre, Zara, en la misma clase. Siempre que necesitemos diferenciarlos definitivamente tendríamos que utilizar alguna información adicional junto con su nombre, como la zona, si viven en otra zona o el nombre de su madre o padre, etc.
La misma situación puede surgir en sus aplicaciones C ++. Por ejemplo, podría estar escribiendo un código que tiene una función llamada xyz () y hay otra biblioteca disponible que también tiene la misma función xyz (). Ahora el compilador no tiene forma de saber a qué versión de la función xyz () se está refiriendo dentro de su código.
UNA namespaceestá diseñado para superar esta dificultad y se utiliza como información adicional para diferenciar funciones, clases, variables, etc. similares con el mismo nombre disponibles en diferentes bibliotecas. Usando el espacio de nombres, puede definir el contexto en el que se definen los nombres. En esencia, un espacio de nombres define un ámbito.
Definición de un espacio de nombres
Una definición de espacio de nombres comienza con la palabra clave namespace seguido del nombre del espacio de nombres de la siguiente manera:
namespace namespace_name {
// code declarations
}
Para llamar a la versión habilitada para el espacio de nombres de una función o variable, anteponga (: :) el nombre del espacio de nombres de la siguiente manera:
name::code; // code could be variable or function.
Veamos cómo el espacio de nombres abarca las entidades, incluidas las variables y las funciones:
#include <iostream>
using namespace std;
// first name space
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
}
// second name space
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
int main () {
// Calls function from first name space.
first_space::func();
// Calls function from second name space.
second_space::func();
return 0;
}
Si compilamos y ejecutamos el código anterior, esto produciría el siguiente resultado:
Inside first_space
Inside second_space
La directiva using
También puede evitar anteponer los espacios de nombres con el using namespacedirectiva. Esta directiva le dice al compilador que el código subsiguiente utiliza nombres en el espacio de nombres especificado. Por lo tanto, el espacio de nombres está implícito para el siguiente código:
#include <iostream>
using namespace std;
// first name space
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
}
// second name space
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
using namespace first_space;
int main () {
// This calls function from first name space.
func();
return 0;
}
Si compilamos y ejecutamos el código anterior, esto produciría el siguiente resultado:
Inside first_space
La directiva 'using' también se puede usar para referirse a un elemento en particular dentro de un espacio de nombres. Por ejemplo, si la única parte del espacio de nombres estándar que pretende utilizar es cout, puede consultarlo de la siguiente manera:
using std::cout;
El código subsiguiente puede referirse a cout sin anteponer el espacio de nombres, pero otros elementos del std el espacio de nombres aún deberá ser explícito de la siguiente manera:
#include <iostream>
using std::cout;
int main () {
cout << "std::endl is used with std!" << std::endl;
return 0;
}
Si compilamos y ejecutamos el código anterior, esto produciría el siguiente resultado:
std::endl is used with std!
Nombres introducidos en un usingLa directiva obedece a las reglas de alcance normales. El nombre es visible desde el punto delusingdirectiva hasta el final del ámbito en el que se encuentra la directiva. Las entidades con el mismo nombre definido en un ámbito externo están ocultas.
Espacios de nombres no contiguos
Un espacio de nombres se puede definir en varias partes y, por lo tanto, un espacio de nombres se compone de la suma de sus partes definidas por separado. Las partes independientes de un espacio de nombres se pueden distribuir en varios archivos.
Entonces, si una parte del espacio de nombres requiere un nombre definido en otro archivo, ese nombre aún debe declararse. Escribir una siguiente definición de espacio de nombres define un nuevo espacio de nombres o agrega nuevos elementos a uno existente:
namespace namespace_name {
// code declarations
}
Espacios de nombres anidados
Los espacios de nombres se pueden anidar donde puede definir un espacio de nombres dentro de otro espacio de nombres de la siguiente manera:
namespace namespace_name1 {
// code declarations
namespace namespace_name2 {
// code declarations
}
}
Puede acceder a los miembros del espacio de nombres anidado utilizando operadores de resolución de la siguiente manera:
// to access members of namespace_name2
using namespace namespace_name1::namespace_name2;
// to access members of namespace:name1
using namespace namespace_name1;
En las declaraciones anteriores, si está utilizando namespace_name1, los elementos de namespace_name2 estarán disponibles en el alcance de la siguiente manera:
#include <iostream>
using namespace std;
// first name space
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
// second name space
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
}
using namespace first_space::second_space;
int main () {
// This calls function from second name space.
func();
return 0;
}
Si compilamos y ejecutamos el código anterior, esto produciría el siguiente resultado:
Inside second_space