estaba leyendo esto La primera respuesta de @Andrei T dice que
Un objeto "grande" nunca es una expresión constante en C, incluso si el objeto se declara como const. Los objetos calificados como const (de cualquier tipo) no son constantes en la terminología del lenguaje C. No se pueden utilizar en inicializadores de objetos con duración de almacenamiento estático, independientemente de su tipo.
Por ejemplo, esto NO es una constante
const int N = 5; /* `N` is not a constant in C */La N anterior 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 objeto estático con una no constante
Estoy de acuerdo con su respuesta. También probé un ejemplo simple como el siguiente en gcc 4.8.2 y 4.9.2 y da errores de compilación como esperaba:
#include <stdio.h> int main(void) { const int a=5; static int b=a; printf("%d",b); } Pero cuando lo probé en ideone.com , compila y funciona bien y da el resultado esperado. Vea la demostración en vivo aquí . Además, en codeblocks 13.12 IDE (gcc 4.7.1) este programa funciona bien. Entonces, ¿es un error del compilador o una extensión gcc? ¿Qué combinación de opciones de compilador usa ideone bajo el capó? Entonces, ¿cómo y por qué se compila en ideone ? ¿Cuál es la razón?
Esto parece ser una especialidad de gcc. Compilar con -std=c89 o -pedantic informa el error.
Dado que en todos los estándares de C esto es una violación de restricción, no dar un diagnóstico para ese caso hace que gcc no tenga uno de los -std=c?? opciones un compilador no conforme.
Es porque el ideone probablemente invoca gcc con la opción -O (nivel de optimización 1). Este es el caso incluso para versiones anteriores de gcc (la mía es 4.4.7):
$ gcc -ansi main.c main.c: In function 'main': main.c:6: error: initializer element is not constant $ gcc -ansi -O main.c $ echo $? 0 Lo que es interesante aquí es que con -pedantic está funcionando correctamente nuevamente y el mensaje de diagnóstico requerido está presente (probado solo con 4.4.7, vea el comentario de Keith ):
gcc -ansi -pedantic -O main.c main.c: In function 'main': main.c:6: error: initializer element is not constant $ echo $? 1