¿Por qué la variable const no necesita inicializarse en C?

5 minutos de lectura

Avatar de usuario de Destructor
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?

  • 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

AnT destaca con el avatar de usuario de Rusia
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 - Restablecer el avatar de usuario de Monica
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 constsu 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?

¿Ha sido útil esta solución?