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)
[1] Cualquier posible inconsistencia de nuestro programa con la nueva librería sería detectada por el compilador.