Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


4.1.11a  Declarar un subespacio

§1  Sinopsis

Utilizar subespacios de nombres en C++ es muy sencillo y requiere solo dos pasos: El primero, declarar biunívocamente un subespacio con la palabra clave namespace; el segundo, acceder a los elementos del mismo (4.1.11c).

§2  Declarar un subespacio

En cuanto a la primera parte, existen tres formas de definir un espacio de nombres con la palabra namespace (el cuerpo del subespacio es opcional).

§2.1  Definición inicial:

namespace identificador { cuerpo-de-subespacio }

§2.2  Ampliación de un subespacio existente ( 4.1.11d):

namespace nombre-de-subespacio-existente { cuerpo-de-subespacio }

§2.3  Definición de espacio de nombres anónimo ( 4.1.11b):

namespace { cuerpo-de-subespacio }

§3  Sintaxis:

namespace <nombre-de-subespacio> { ... cuerpo del subespacio ...}
namespace { ... cuerpo del subespacio ...}

  nombre-de-subespacio.  Un identificador (generalmente en MAYÚSCULAS) que no esté siendo usado previamente por un identificador de ámbito global.  Ejemplo:

namespace ALPHA {       // ALPHA es el identificador del subespacio
   /* declaraciones */
  long double LD;
  float f(float y) { return y; }
}

§4  Comentario

El boque delimitado por { } comprende el subespacio. El identificador del subespacio debe ser conocido en todas las unidades de compilación desde donde se deba acceder a alguno de sus elementos. Si se omite el identificador se tiene un subespacio anónimo ( 4.1.11b).


  Los subespacios son de ámbito global, por lo que deben declararse fuera de cualquier función o clase, aunque a su vez pueden ser divididos en subespacios, es decir, son permitidos subespacios anidados dentro de otros. Ejemplo:

namespace UNO {         // Ok subespacio exterior
  int x;
  char c;
  namespace UNO_A {     // Ok. anidado primer nivel
    int x;
    char c;
    namespace UNO_A1 {  // Ok. anidado segundo nivel
      inxt x;
      char c;
    }
  }
  namespace UNO_B {     // Ok. anidado primer nivel
    int x;
    char c;
  }
  long lo;
}
...
void main (void) {      // ===================
  int x = 1
  namespace TRES {      // ERROR: subespacio en función
    int x ;
  }
  ...
  UNO::x = 1;
  UNO::UNO_A::x = 2;
  UNO::UNO_A::UNO_A1::x = 3;
  ...
}

Observe que se utiliza el operador de resolución de acceso :: ( 4.9.19) para acceder a elementos de subespacios, incluso anidados.

§5  Alias de subespacios

Se puede utilizar un nombre alternativo (alias) para referirse a un subespacio de nombres. Un alias es útil para referirse a un identificador de subespacio de nomenclatura farragosa.  Ejemplo:

namespace COMUNICACIONES {
   /* cuerpo del subespacio */
   namespace COMUNICACIONES_TCPIP { // subespacio anidado
      /* cuerpo del subespacio anidado */
   }

}
...
namespace PC = COMUNICACIONES;   // alias de subespacio
// alias de subespacio anidado
namespace PCTCPIP = COMUNICACIONES::COMUNICACIONES_TCPIP;


Los alias deben usarse con moderación, dado que su uso indiscriminado puede dar lugar a confusión. No obstante, lo mismo que en el caso de typedef ( 3.2.1a), los alias de subespacios también pueden ser útiles para facilitar el cambio de una librería por otra, localizando todas las referencias concretas en un solo punto (donde se declara el alias), de forma que los posibles cambios posteriores solo requieren cambiar una línea de código [1]. Por ejemplo: supongamos que en un programa utilizamos la librería de comunicaciones lib-v11 que tiene declarado su propio subespacio como LV11 por lo que utilizamos en nuestro código expresiones tales como:

LV11::tcpip = 12;
LV11::connect(tcpip);
...

Si tuviésemos que cambiar la librería por una versión más moderna, digamos lib-v12 que cuyo subespacio se ha definido como LV12, tendríamos que renombrar todas las líneas al nuevo tenor:

LV12::tcpip = 12;
LV12::connect(tcpip);
...

En estas circunstancias es más fácil hacer desde el principio:

namespace LV11 = COM
COM::tcpip = 12;
COM::connect(tcpip);
...

El cambio a la nueva versión solo habría exigido cambiar una línea de código:

namespace LV12 = COM
COM::tcpip = 12;
COM::connect(tcpip);
...

Observe que el alias de un subespacio realiza una función parecida a la de typedef, aunque de uso más específico.

  Tema relacionado:

El ámbito de nombres y la sobrecarga de funciones ( 4.4.1a)

  Inicio.


[1]  Cualquier posible inconsistencia de nuestro programa con la nueva librería sería detectada por el compilador.