Cómo son los espacios de nombres sin nombre superior a la static palabra clave?

  • Sin embargo, los espacios de nombres sin nombre no son suficientes reemplazo para el espacio de nombres-estática, de acuerdo con el comité de normas. todavía Hay un par de casos donde los espacios de nombres sin nombre fallar y sólo static obras.
InformationsquelleAutor Nawaz | 2010-12-12

3 Comentarios

  1. 120

    Básicamente, al referirse a la sección $7.3.1.1/2 en el Estándar de C++,


    El uso de la palabra clave static es
    obsoleto cuando se declaran los objetos en un
    ámbito de espacio de nombres; la
    sin nombre-espacio de nombres proporciona un superior
    alternativa.

    Sin nombre de espacio de nombres es superior a la palabra clave static, principalmente porque la palabra clave static sólo se aplica a la variables declaraciones y funciones, no se a definido por el usuario tipos.

    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 */ };

    Así que la solución es, sin nombre-espacio de nombres, que es este,

       //legal code
       namespace 
       {  
            class sample_class { /* class body */ };
            struct sample_struct { /* struct body */ };
       }

    Espero que explica que el motivo por el unnamed-namespace es superior a static.


    También, tenga en cuenta que el uso de la palabra clave static es obsoleto cuando se declaran los objetos en un ámbito de espacio de nombres (según la Norma).

    • Más generalmente, un sin nombre de espacio de nombres permite la vinculación externa. Que es lo que permite a los locales a la traducción-de la unidad de la declaración de la clase. También permite, por ejemplo, la vinculación externa constante de cadena, para ser utilizado como argumento de plantilla.
    • Eso es cierto. Gracias por la adición. 🙂
    • Como señaló Fred Nurk en otro de su respuesta, parece que este deprecated comentario fue eliminado de la última C++0x FCD (n3225).
    • «tenga en cuenta que el uso de la palabra clave static es obsoleto cuando se declaran los objetos en un ámbito de espacio de nombres (según la Norma).» y cree que esta en desuso ha cualquier peso? Quiero decir, en absoluto.
    • Como escribí en la misma línea, lo que probablemente pasa por alto : «…como por el Estándar«.
    • Tomé eso como un «no».
    • Incluso el Estándar no creo que más. C++11 ha eliminado la obsolescencia!
    • La idea de que algún significado histórico de static iba a ser eliminado de C++, algún día, era gracioso, de hecho (por 5 minutos).
    • Usted está respondiendo propia pregunta y gracias diciendo a ti mismo 😮
    • ¿Cuál sería la diferencia a partir de la definición de la clase en el cpp (no anónimo espacio de nombres, no estática)?
    • La vinculación de los problemas en el caso 2 .cpp son la definición de una clase con el mismo nombre.
    • Por favor, edite la respuesta para explicar el misterioso ponches…
    • el tachado se explica en otra pregunta.

  2. 6

    El Estándar de C++ se lee en la sección 7.3.1.1 espacios de nombres sin nombre, párrafo 2:

    El uso de la palabra clave static es
    obsoleto cuando se declaran los objetos en un
    ámbito de espacio de nombres, la sin nombre-espacio de nombres
    proporciona una alternativa superior.

    Estática sólo se aplica a los nombres de objetos, funciones, anónimo y de los sindicatos, no a las declaraciones de tipo.

    • No, No es así. Un proyecto que hizo. Y otro proyecto muy pronto después de que volvió de este tonto cambio.
  3. 6

    Hay un problema interesante con relación a esto:

    Supongamos que el uso de static palabra clave o sin nombre namespace para realizar alguna función interna del módulo (unidad de traducción), ya que esta función está destinado a ser utilizado internamente por el módulo y no son accesibles fuera de ella. (Sin nombre namespaces tienen la ventaja de hacer que los datos y las definiciones de tipo interno, también, además de las funciones).

    Con el tiempo, el archivo de código fuente de la aplicación del módulo crece grande, y desea dividirlo en varios archivos de origen independientes, lo que permitiría una mejor organización del código, la búsqueda de las definiciones más rápido, y para ser compilados de forma independiente.

    Pero ahora se enfrentan a un problema: Esas funciones no pueden ser static para el módulo, porque static en realidad no se refieren a la módulo, pero a la archivo de origen (unidad de traducción). Usted está obligado a hacer que nostatic que les permita el acceso desde otras partes de objeto (archivos) de dicho módulo. Pero esto también significa que ya no están ocultas/privada para el módulo: tener vinculación externa, que se puede acceder desde otros módulos, que fue no su intención original.

    Sin nombre namespace no resolver este problema, porque también está definido para un determinado archivo de origen (unidad de traducción) y no se puede acceder desde el exterior.

    Sería genial si se pudiera especificar que algunos namespace es private, que es, lo que es definido en el mismo, está destinado a ser utilizado internamente por el módulo a la que pertenece. Pero, por supuesto, C++ no tiene tal concepto como «módulos», sólo «unidades de traducción», que están estrechamente vinculados a los archivos de origen.

    • Sería un hack y una solución limitada de todos modos, pero se podrían incluir el archivo cpp(s) con la interna estática o nombres de espacios de funciones en su ‘principal’ archivos cpp. Luego de excluir estos ‘satélite’ archivo cpp(s) de construir y listo. El único problema si usted tiene dos o más ‘principal’ archivos cpp y que ambos quieren usar que el fresco de la función de uno de los ‘satélite’ archivos cpp…
    • no está haciendo uso de la herencia con private/ protected/ público con funciones estáticas de la solución?
    • C++20 presenta los módulos, que resuelve le problema.

Dejar respuesta

Please enter your comment!
Please enter your name here