c++ - que - ¿Superioridad del espacio de nombre sin nombre sobre estático?
use namespace php (3)
¿Cómo son los espacios de nombres sin nombre superiores a la palabra clave static
?
Básicamente, se refiere a la sección $ 7.3.1.1 / 2 del Estándar C ++,
El uso de la palabra clave estática está en desuso al declarar objetos en un ámbito de espacio de nombres; el espacio de nombre sin nombre proporciona una alternativa superior.
El espacio de nombres sin nombre es superior a la palabra clave estática, principalmente porque la palabra clave static
aplica solo a las declaraciones y funciones de variables , no a los tipos definidos por el usuario.
El siguiente código es válido en C ++
//legal code
static int sample_function() { /* function body */ }
static int sample_variable;
Pero este código NO es válido:
//illegal code
static class sample_class { /* class body */ };
static struct sample_struct { /* struct body */ };
Entonces la solución es el espacio de nombre sin nombre, que es esto,
//legal code
namespace
{
class sample_class { /* class body */ };
struct sample_struct { /* struct body */ };
}
Espero que explique por qué unnamed-namespace
es superior a la static
.
Además, tenga en cuenta que el uso de la palabra clave estática está en desuso al declarar objetos en un ámbito de espacio de nombres (según el Estándar).
El estándar C ++ lee en la sección 7.3.1.1 Espacios de nombre sin nombre, párrafo 2:
El uso de la palabra clave estática se desaprobaba al declarar objetos en un ámbito de espacio de nombres, el espacio de nombres sin nombre proporciona una alternativa superior.
Static solo se aplica a nombres de objetos, funciones y uniones anónimas, no a declaraciones de tipos.
Hay un problema interesante relacionado con esto:
Supongamos que utiliza una palabra clave static
o un namespace
nombre sin namespace
para hacer que una función sea interna del módulo (unidad de traducción), ya que esta función está destinada a ser utilizada internamente por el módulo y no se puede acceder fuera de ella. (Los namespace
nombre sin namespace
tienen la ventaja de hacer que las definiciones de datos y tipos también sean internas, además de las funciones).
Con el tiempo, el archivo fuente de la implementación de su módulo crece y le gustaría dividirlo en varios archivos fuente separados, lo que permitiría organizar mejor el código, encontrar las definiciones más rápidamente y compilarse de manera independiente.
Pero ahora se enfrenta a un problema: esas funciones ya no pueden ser static
para el módulo, ya que static
no se refiere al módulo , sino al archivo fuente (unidad de traducción). Se lo fuerza a hacer que no sea static
para permitir el acceso desde otras partes (archivos de objeto) de ese módulo. Pero esto también significa que ya no están ocultos / privados para el módulo: al tener un enlace externo, se puede acceder desde otros módulos, lo cual no era su intención original.
El namespace
nombre sin namespace
tampoco resolvería este problema, porque también está definido para un archivo fuente particular (unidad de traducción) y no se puede acceder desde el exterior.
Sería grandioso si se pudiera especificar que algún namespace
es private
, es decir, lo que sea que esté definido en él, está destinado a ser utilizado internamente por el módulo al que pertenece. Pero, por supuesto, C ++ no tiene un concepto como "módulos", solo "unidades de traducción", que están estrechamente vinculadas a los archivos fuente.