Saltar al contenido

Error “el elemento inicializador no es constante” al intentar inicializar la variable con const

Recuerda que en la informática cualquier problema casi siempere puede tener diferentes soluciones, así que nosotros compartimos la mejor y más eficiente.

Solución:

En lenguaje C, los objetos con static la duración del almacenamiento debe inicializarse con expresiones constanteso con inicializadores agregados que contienen expresiones constantes.

Un objeto “grande” nunca es una expresión constante en C, incluso si el objeto se declara como const.

Además, en lenguaje C, el término “constante” se refiere a constantes literales (me gusta 1, 'a', 0xFF etcétera), miembros de la enumeración y resultados de operadores tales como sizeof. Los objetos calificados const (de cualquier tipo) son no constantes en la terminología del lenguaje C. No se pueden utilizar en inicializadores de objetos con static duración del almacenamiento, independientemente de su tipo.

Por ejemplo, esto es NO una constante

const int N = 5; /* `N` is not a constant in C */

Lo anterior N sería una constante en C++, pero no es una constante en C. Entonces, si intentas hacer

static int j = N; /* ERROR */

obtendrá el mismo error: un intento de inicializar un static objeto con una no constante.

Esta es la razón por la cual, en lenguaje C, usamos predominantemente #define para declarar constantes con nombre, y también recurrir a #define para crear inicializadores agregados con nombre.

Es una limitación del lenguaje. En la sección 6.7.8/4:

Todas las expresiones en un inicializador para un objeto que tiene static la duración del almacenamiento serán expresiones constantes o string literales.

En la sección 6.6, la especificación define lo que debe considerarse una expresión constante. En ningún lugar dice que una variable const debe considerarse una expresión constante. Es legal que un compilador amplíe esto (6.6/10 - An implementation may accept other forms of constant expressions) pero eso limitaría la portabilidad.

si puedes cambiar my_foo entonces no tiene static almacenamiento, estarías bien:

int main()

    foo_t my_foo = foo_init;
    return 0;

Solo como ilustración por comparación y contraste. El código es de http://www.geeksforgeeks.org/g-fact-80/ /El código falla en gcc y pasa en g++/

#include
int initializer(void)

    return 50;


int main()

    int j;
    for (j=0;j<10;j++)
    
        static int i = initializer();
        /*The variable i is only initialized to one*/
        printf(" value of i = %d ", i);
        i++;
    
    return 0;

Te invitamos a añadir valor a nuestra información cooperando tu veteranía en las explicaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *