Espacios de nombres en C++

Jinku Hu 12 octubre 2023
  1. Utilice la palabra clave namespace para crear un nuevo espacio de nombres en C++
  2. Use espacios de nombres anidados para implementar ámbitos complejos en C++
Espacios de nombres en C++

Este artículo explicará cómo usar espacios de nombres en C++.

Utilice la palabra clave namespace para crear un nuevo espacio de nombres en C++

C++ tiene el concepto de espacios de nombres que ayudan a prevenir un problema común en proyectos grandes llamado conflictos de nombres. Cuando el proyecto dado utiliza diferentes bibliotecas desarrolladas por equipos independientes y tiene muchos nombres globales para diferentes objetos, es inevitable que algunos nombres coincidan y provoquen errores. El espacio de nombres declara un ámbito donde se definen ciertos nombres de funciones u otros objetos. Recuerde que existen reglas de alcance automáticas en C++ que gobiernan cómo se ven y están disponibles los nombres de los objetos en diferentes regiones de código. Por ejemplo, la variable local declarada en la función no se ve ni es accesible fuera del cuerpo de la función. Entonces, otra variable con el mismo nombre se puede declarar fuera del cuerpo de esta función sin ningún conflicto. Por otro lado, tenemos un único alcance global, que a menudo es utilizado por grandes programas para hacer que ciertos objetos estén disponibles en los archivos o funciones. Ahora, imagine cómo se puede administrar el espacio sin ningún mecanismo de alcance manual.

De hecho, los programadores solían lidiar con la colisión de nombres usando nombres muy largos para objetos globales. Puede funcionar para proyectos de tamaño relativamente pequeño, pero hace que el código sea bastante complicado de leer y la solución aún no puede evitar las colisiones de nombres sin un esquema de nombres coordinado.
Los espacios de nombres proporcionan un mecanismo para particionar un ámbito global (en consecuencia, se denomina espacio de nombres). Un espacio de nombres se declara con la palabra clave namespace seguida del nombre del espacio de nombres en sí. Luego sigue el código entre llaves similar al bloque de funciones, y termina sin punto y coma. Las mismas reglas de alcance automático gobiernan las variables dentro de un espacio de nombres que otras partes del código. Los nombres de los objetos a los que se debe acceder desde fuera del espacio de nombres deben comenzar con el nombre del espacio de nombres en el que están definidos, seguido de la notación de dos puntos y luego el nombre del objeto. El siguiente ejemplo de código demuestra el caso de uso básico donde para los espacios de nombres en el mismo archivo.

#include <iostream>

using std::cout;
using std::endl;

namespace dinno {
int var1 = 456;
}

int main() {
  int var1 = 123;

  cout << var1 << endl;
  cout << dinno::var1 << endl;

  return EXIT_SUCCESS;
}

Producción :

123
456

Use espacios de nombres anidados para implementar ámbitos complejos en C++

Los espacios de nombres se pueden anidar, de forma similar a las declaraciones de bucle. De forma predeterminada, un espacio de nombres anidado tiene acceso a los nombres de los objetos en el espacio de nombres externo, pero este último (a menudo llamado espacio de nombres principal) no puede acceder a los miembros en el espacio de nombres interno. Aunque, se puede especificar la palabra clave inline antes de la declaración del espacio de nombres interno para que sus miembros sean accesibles en el espacio de nombres principal. Los espacios de nombres se pueden definir en diferentes lugares. Es decir, la misma definición de espacio de nombres puede abarcar diferentes archivos o lugares separados en un solo archivo, ya que los espacios de nombres dinno se definen en el siguiente ejemplo.

#include <iostream>

using std::cout;
using std::endl;

namespace dinno {
int var1 = 456;
}

namespace gini {
int var1 = 980;

namespace bean {
int var1 = 199;
}
}  // namespace gini

namespace dinno {
int var2 = 990;
}

int var1 = 123;

int main() {
  cout << var1 << endl;
  cout << dinno::var1 << endl;
  cout << gini::var1 << endl;
  cout << dinno::var2 << endl;
  cout << gini::bean::var1 << endl;

  return EXIT_SUCCESS;
}

Producción :

123
456
980
990
199
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook