En C++ es posible usar el static
palabra clave dentro de una unidad de traducción para afectar la visibilidad de un símbolo (ya sea variable o declaración de función).
En n3092, esto quedó en desuso:
Anexo D.2 [depr.static]
El uso de la palabra clave estática está en desuso cuando se declaran objetos en el ámbito del espacio de nombres (ver 3.3.6).
En n3225, esto se eliminó.
los único artículo que pude encontrar es algo informal.
Sin embargo, subraya que por compatibilidad con C (y la capacidad de compilar programas C como C ++), la desaprobación es molesta. Sin embargo, compilar un programa C directamente como C++ ya puede ser una experiencia frustrante, por lo que no estoy seguro de si merece consideración.
¿Alguien sabe por qué se cambió?
En Informes de defectos del lenguaje central estándar de C++ y problemas aceptados, revisión 94 bajo 1012. Undeprecating static
ellos notan:
Aunque 7.3.1.1 [namespace.unnamed] establece que el uso de la palabra clave estática para declarar variables en el ámbito del espacio de nombres está en desuso porque el espacio de nombres sin nombre proporciona una alternativa superior, es poco probable que la función se elimine en algún momento en el futuro previsible.
Básicamente esto está diciendo que la desaprobación de static
realmente no tiene sentido. Nunca se eliminará de C++. Todavía es útil porque no necesita el código repetitivo que necesitaría con unnamed namespace
‘s si solo desea declarar una función u objeto con enlace interno.
Intentaré responder a su pregunta, aunque es una pregunta antigua y no parece muy importante (realmente no es muy importante en si mismo), y ya ha recibido respuestas bastante buenas. La razón por la que quiero responder es que se relaciona con cuestiones fundamentales de la evolución estándar y el diseño del lenguaje cuando el lenguaje se basa en un lenguaje existente: ¿cuándo las características del idioma deben quedar obsoletas, eliminarse o cambiarse de formas incompatibles?
En C++ es posible usar la palabra clave estática dentro de una unidad de traducción para afectar la visibilidad de un símbolo (ya sea variable o declaración de función).
El vínculo en realidad.
En n3092, esto quedó en desuso:
La desaprobación indica:
- los intención para eliminar alguna característica en el futuro; esto no significa que las funciones en desuso se eliminarán en la próxima revisión estándar, o que deban eliminarse “pronto”, o en absoluto. Y las funciones no obsoletas pueden eliminarse en la próxima revisión estándar.
- Un intento formal de desalentar su uso.
Este último punto es importante. Aunque nunca hay una promesa formal de que su programa no se romperá, a veces en silencio, por el próximo estándar, el comité debe tratar de evitar romper el código “razonable”. La desaprobación debería decirles a los programadores que no es razonable depender de alguna característica.
Sin embargo, subraya que por compatibilidad con C (y la capacidad de compilar programas C como C ++), la desaprobación es molesta. Sin embargo, compilar un programa C directamente como C++ ya puede ser una experiencia frustrante, por lo que no estoy seguro de si merece consideración.
Es muy importante conservar un subconjunto común de C/C++, especialmente para los archivos de encabezado. Por supuesto, static
Las declaraciones globales son declaraciones de símbolo con enlace interno y esto no es muy útil en un archivo de encabezado.
Pero el problema nunca es solo la compatibilidad con C, es la compatibilidad con C++ existente: hay toneladas de programas C++ válidos existentes que usan static
declaraciones globales. Este código no es sólo formalmente legal, es sólido, como utiliza una función de lenguaje bien definida de la forma en que está destinado a ser utilizado.
El hecho de que ahora haya una “mejor manera” (según algunos) de hacer algo no hace que los programas escritos de la manera anterior sean “malos” o “irrazonables”. La habilidad de usar el static
La palabra clave en declaraciones de objetos y funciones en el ámbito global se entiende bien en las comunidades de C y C++, y se usa correctamente con mayor frecuencia.
De manera similar, no voy a cambiar los moldes de estilo C a double
para static_cast<double>
solo porque “los moldes de estilo C son malos”, como static_cast<double>
añade cero información y cero seguridad.
La idea de que cada vez que se invente una nueva forma de hacer algo, todos los programadores se apresuren a reescribir su código de trabajo bien definido existente es una locura. Si desea eliminar toda la fealdad y los problemas heredados de C, no cambia C++, inventa un nuevo lenguaje de programación. Retirar a la mitad un uso de static
difícilmente hace que C++ sea menos C-feo.
Los cambios de código necesitan una justificación, y “lo viejo es malo” nunca es una justificación para los cambios de código.
Romper los cambios de idioma necesita una justificación muy sólida. Hacer que el lenguaje sea un poco más simple nunca es una justificación para un cambio radical.
Las razones dadas por qué static
es malo son notablemente débiles, y ni siquiera está claro por qué las declaraciones de objetos y funciones no están en desuso juntas; darles un tratamiento diferente difícilmente hace que C++ sea más simple u ortogonal.
Entonces, realmente, es una historia triste. No por las consecuencias prácticas que tuvo: tuvo exactamente cero consecuencias prácticas. Sino porque muestra una clara falta de sentido común por parte del comité ISO.
Ya sea obsoleta o no, la eliminación de esta función de idioma rompería los códigos existentes y molestaría a las personas.
Todo el asunto de la desaprobación estática fue solo una ilusión en la línea de “los espacios de nombres anónimos son mejores que los estáticos” y “las referencias son mejores indicadores”. Jajaja.
¿Declaras objetos en el ámbito del espacio de nombres en C?
– Étienne de Martel
18 de enero de 2011 a las 16:44
je, gracias, encontré dónde conseguirlo. Intenté eliminar el comentario pero me ganaste allí.
– Edward Extraño
18 de enero de 2011 a las 17:10
La pregunta surgió de stackoverflow.com/questions/4725204/…
– Fred Nurk
18 de enero de 2011 a las 17:28
Esto también le da al Comité de C++ la oportunidad de eliminar algo en la próxima versión del Estándar 🙂
–James McNellis
10 de febrero de 2011 a las 22:48
stackoverflow.com/questions/4422507/…
– Martín Ba
4 de julio de 2013 a las 12:07