Mautic Pixel

Las cookies nos permiten ofrecer nuestros servicios. Al utilizar nuestros servicios, aceptas el uso que hacemos de las cookies. Más Información. Aceptar

Qué son los Namespaces en C++

Antonio José Checa Bustos
Qué son los Namespaces en C++

C++ es uno de los lenguajes más usados por los programadores , es un lenguaje rápido, eficaz y flexible.

Con este lenguaje podrás crear todo tipo de programas , desde videojuegos, motores gráficos, hasta controladores de hardware y sistemas operativos. Por todo esto vamos a ver la importancia que tienen y como nos  ayudan los namespaces (o espacio de nombre) a la hora de desarrollar en C++ cuando declaramos funciones.

¿Qué son los namespaces?

Un namespace, no es más que una forma de crear un bloque , y que todas las funciones que estén dentro del mismo, estén asociadas a ese namespace (o espacio de nombres), al cual se le asigna un nombre para identificarlo.

Por ejemplo:

namespace hola

    void f() 
    { 
        std::cout << “hola”;
    }

En este ejemplo, la función f está asociada al namespace hola .

¿Por qué surgieron los namespaces?

Todo se remonta al lenguaje C, en el que no existe el concepto de namespace.

En este lenguaje, a la hora de importar una librería, si esa librería tenía, por ejemplo, una función print, si nuestro programa contenía ya esa función, teníamos un problema, ya que ni en C ni en C++ se pueden declarar y definir funciones con el mismo nombre .

La solución para que eso no ocurriera fue comenzar a utilizar acrónimos, para que las funciones empezaran o acabaran con ese nombre.

Por ejemplo, OpenGL, todas sus funciones comienzan por gl, de esta forma cuando se llama a una función gl_print, sabemos que es de OpenGL y no tendremos problemas, ya que es extraño que otra persona tenga en su código una función llamada gl_print.

Para evitar esto, se añadieron los namespace a C++ .

Ejemplos de namespaces

Por ejemplo, creamos una función f , la compilamos y la llamamos, nos mostrará la palabra “adios”:

void f() 
{ 
     std::cout << “adios”; 
}

Si posteriormente añadimos otra función f , que escriba “hola”, la ejecutamos, se produce un error de compilación, ya que la función ya existe.


void f()
{
    std::cout << “adios”;
}

void f()
{
   std::cout << “hola”;
}

Al añadir el namespace se evita ese problema . Para utilizar el namespace hola, solo tenemos que indicar el nombre del mismo, seguido dos puntos dobles, que es el ámbito al que pertenece la función, y llamar a la función que queremos.

Con esto no solo podemos encapsular funciones , sino también atributos , objetos , clases y muchas cosas más de C++.


namespace hola

{
    void f() { std::cout << “hola”;
}

void f()
{
    std::cout << “adios”;
}

int main()
{
    f();
hola::f();
getchar();
return 0;
}

Al ejecutar ese código se nos muestra “adioshola” .

Hay una forma para evitar usa estos encapsulamientos, que sería así:


using namespace std;

int main()
{
    f();
hola::f();
cout << “loquesea”;
getchar();
return 0;
}

De esta forma, al indicar el namespace std, que es el namespace dónde está incluida toda la librería estándar de C++, ya no tenemos que indicar std::cout , sino que directamente indicamos cout.

Al utilizar este sistema hay que tener cuidado , porque se puede presentar algún problema de ambigüedad . Por ejemplo:


namespace hola

{
    void f() { std::cout << “hola”;
}

void f()
{
    std::cout << “adios”;
}

using namespace std;
using namespace hola;

int main()
{
    f();
hola::f();
cout << “loquesea”;
getchar();
return 0;
}

Se produce una ambigüedad al emplear el using namespace , ya que tanto std como hola tienen incluida la función f. Lo mismo ocurriría en caso de otra función que estuviese incluida en ambos namespaces .

Para evitar este problema de ambigüedad habría que separar esos namespaces, por ejemplo así:

namespace hola<
{
void f() { std::cout << “hola”;
}

namespace otro
{

void f()
{
    std::cout << “adios”;
}
}

using namespace std;
using namespace hola;

int main()
{
f();
otro::f();
cout << “loquesea”;
getchar();
return 0;
}

Es importante saber separar los using namespace , y no se recomienda utilizar el using namespace std a menos que se esté muy seguro de que no va haber ninguna función que se utilice.

Además no es recomendable utilizar using namespace dentro de los archivos de cabecera *.hpp , que son incluidos en otros ficheros, y que puede provocar inclusiones recursivas, con lo que puede fallar y no que si lo provoca nuestro código o a una librería externa.

Relacionado

Te dejamos una selección de cursos, carreras y artículos

Qué son las interfaces en C++

Qué son las interfaces en C++

Lenguajes de programación

31 de Octubre de 2018

Aprende de forma rápida y con un caso práctico qué son las clases abstractas o interfaces en C++.

Programador en C++

Programador en C++

carrera

Incluye 8 cursos:

  • Curso de Introducción a la programación con Pseudocódigo
  • Curso de introducción a C++
  • Curso de Programación orientada a objetos con C++

y 5 cursos más!

Duración: 22 horas y 43 minutos

Estas son algunas de las empresas que ya confían en OpenWebinars

Profesores y profesionales

Nuestros docentes son profesionales que trabajan día a día en la materia que imparten

Conviértete en profesor de OpenWebinars