Incinerador de basuras
const
las variables en C++ deben inicializarse significa uninitialized const variable
no es posible y es un error del compilador. Pero, ¿por qué no es lo mismo en lenguaje C también? Considere el siguiente programa que compila bien C:
#include <stdio.h>
int main()
{
const int a;
}
¿Cuál es la razón para permitir uninitialized const
? ¿No sería bueno que C también siguiera la misma regla que C++? ¿Se debe a problemas de rendimiento que la variable const local debe inicializarse cada vez que se llama a una función y la inicialización lleva tiempo?
AnT apoya a Rusia
La diferencia probablemente se deba, entre otras cosas, a un enfoque significativamente más relajado de la inicialización en lenguaje C. en generalno sólo en lo que respecta a const
objetos. Por ejemplo, este código es ilegal en C++
goto over;
int a = 5;
over:;
porque salta al ámbito de a
pasando por alto su inicialización. Mientras tanto en C este código es perfectamente legal, con variable a
que tiene un valor indeterminado en over:
.
La misma lógica se aplica a su const int a
declaración. El lenguaje C simplemente cree que un objeto no inicializado no es gran cosa, incluso en situaciones en las que ya no es posible establecerlo en un valor determinado más adelante.
La razón principal de los requisitos de inicialización más estrictos en C++ es la introducción de una inicialización no trivial (constructores) en el lenguaje, es decir, una inicialización que no se puede omitir significativamente. Los objetos escalares y su inicialización en C++ simplemente se etiquetan como una pequeña parte de un concepto mucho más amplio.
¿No sería bueno que C también siguiera la misma regla que C++?
no lo veo C y C++ son lenguajes sustancialmente diferentes. y tratan const
muy diferente también.
chux – Reincorporar a Monica
¿Por qué la variable const no necesita inicializarse en C?
Historia.
const
se especificó en C++ desde sus inicios y el uso cumplió con los objetivos de ese lenguaje. const
se especificó más tarde en C con un significado relacionado pero diferente para minimizar los problemas de compatibilidad del código C existente.
Dado que C comenzó sin const
su posterior inclusión es más como una read-only
modificador de un constant
una. Esto permitió a los compiladores existentes tratar de forma esencial const
como nada por escribir a un const
es un comportamiento indefinido. Los compiladores/códigos más nuevos podrían aprovechar eso const
proporciona.
const int a;
a = 5; // problem in C as code attempts to write `a`
// Really should be `const char *fred`, but allowed for backwards compatibility.
char *fred = "sally";
C++ tomó un enfoque más fuerte y exige la inicialización.
Ver también const en C vs const en C++
Porque C tiene absoluta confianza en el programador y le permite hacer muchas cosas, incluidas las estúpidas: int *x = NULL; x[4] = 12;
será compilado sin errores e incluso sin advertencias por parte de muchos compiladores.
Más precisamente, const
es solo una promesa que hace el programador de que la variable no debe modificarse, y que el compilador podría considerarla como constante si puede ayudar a las optimizaciones. Pero el compilador nunca aplicará ninguna regla de tiempo de ejecución para prohibir cambiar un valor constante:
const a = 1;
int *ix = (int *) &a;
*ix = 2;
printf("a=%d\n", a); /* UB : could print 1 or 2 */
será compilado sin una advertencia. Pero invocará un comportamiento indefinido porque modificó un objeto declarado como const.
¡Creo que no se permite inicializar variables const simplemente porque la especificación C actual no lo prohíbe! En versiones anteriores, la inicialización siempre ha sido opcional. Tal vez futuras versiones podrían forzar la inicialización de variables automáticas
De todos modos, una variable const global o estática se inicializa automáticamente (según la especificación del lenguaje C 6.7.9 10): Si un objeto que tiene una duración de almacenamiento estático o de subprocesos no se inicializa explícitamente, entonces: … si tiene un tipo aritmético, se inicializa a cero (positivo o sin signo); …
Asi que static const a;
es perfectamente valido como es const a
si a
es global y en esos casos a=0
.
-
También es posible que algunos sistemas de compilación definan medios a través de los cuales las cosas que serán constantes una vez que se inicie un programa puedan cambiarse entre compilación y ejecución (por ejemplo, mediante una utilidad que lee el mapa de enlaces y parchea el ejecutable). El Estándar C no proporciona medios a través de los cuales tales cosas puedan ocurrir, pero no hay razón para que prohíba una construcción que podría ser útil a través de tales medios.
– Super gato
11 de agosto de 2016 a las 23:14
Creo que la razón es la convención.
En C, virtualmente ningún tipo de objeto es nunca requerido para ser inicializado, y nunca ha sido requerido para ser inicializado.
const
los objetos son solo un tipo más de objetos con una característica especial, ¿por qué hacer una excepción con ellos?
Nota del moderador: Utilice los comentarios para solicitar aclaraciones/discutir la pregunta formulada. Gracias.
–Jon Clements
♦
23 de junio de 2015 a las 14:23