En C99, 6.7.8/3:
El tipo de la entidad a inicializado será una matriz de tamaño desconocido o un tipo de objeto que es no una variable de tipo longitud de la matriz.
6,6/2:
Una expresión constante se puede evaluar durante la traducción en lugar de tiempo de ejecución
6,6/6:
una constante entera expresión deberá tienen un tipo entero y solo tienen operandos que re integer constantes, constantes de enumeración, constantes de caracteres, tamaño de expresiones cuyos resultados son las constantes enteras, y las constantes flotantes que son los operandos inmediatos de los moldes.
6.7.5.2/4:
si el tamaño es un número entero constante expresión y el tipo de elemento tiene un tamaño constante conocida , el tipo de matriz es no una variable de tipo longitud de la matriz; de lo contrario, el tipo de matriz es un tipo de matriz de longitud variable .
a
tiene longitud variable de tipo matriz, porque size
no es una expresión constante entera. Por lo tanto, no puede tener una lista de inicializadores.
En C90, no hay VLA, por lo que el código es ilegal por ese motivo.
En C++ tampoco hay VLA, pero puede hacer que size
sea const int
. Esto se debe a que en C++ puede usar las variables const int
en ICE. En C no puedes.
Es de suponer que no tenía la intención a
tener longitud variable, así que lo que necesita es:
#define size 5
Si realmente tenía la intención a
tener longitud variable, supongo que se podría hacer algo como esto:
int a[size];
int initlen = size;
if (initlen > 5) initlen = 5;
memcpy(a, (int[]){1,2,3,4,5}, initlen*sizeof(int));
O tal vez:
int a[size];
for (int i = 0; i < size && i < 5; ++i) {
a[i] = i+1;
}
Sin embargo, es difícil decir qué "debería" suceder aquí en el caso de tamaño! = 5. Realmente no tiene sentido especificar un valor inicial de tamaño fijo para una matriz de longitud variable.
Use '-std = c99' al compilar con GCC para habilitar matrices de tamaño variable. –
Ya están habilitados; si estuviera en el modo c89, el error sería algo así como 'ISO C90 prohíbe la matriz de longitud variable 'a''. –