2008-10-02 16 views
8

Tengo una función que toma una estructura, y estoy tratando de almacenar sus variables en una matriz, pero obtengo esto cuando ejecuto gcc -Wall -ansi -pedantic -errors -WerrorError: el elemento inicializador no es computable en el tiempo de carga

int detect_prm(Param prm) { 
    int prm_arr[] = {prm.field1, prm.field2, prm.field3}; 

    return 0; 
} 

me sale error: elemento inicializador no es computable en tiempo de carga cuando intento compilar el anterior. Me parece bien, ¿qué pasa?

Respuesta

11

Esto es ilegal en C. Las listas de inicializadores deben ser expresiones de tiempo de compilación constantes. Haga lo siguiente en su lugar:

int prm_arr[3]; 

prm_arr[0] = prm.field1; 
prm_arr[1] = prm.field2; 
prm_arr[2] = prm.field3; 
+11

Ilegal en C89, que es el estándar implícito en -ansi; legal en C99, que se puede habilitar utilizando -std = c99 en lugar de -ansi. –

15

Mike tiene la razón.

Sin embargo, si puede utilizar las extensiones C de GNU o utilizar en su lugar el nuevo y mejor estándar C99 (use la opción --std=c99), los inicializadores como este son perfectamente legales. El estándar C99 ha estado listo durante, bueno, 9 años, y la mayoría de los compiladores de C lo soportan bastante bien ... especialmente esta característica.

+0

Solo FYI, Visual Studio 2008 (que oficialmente solo admite C89) emite la siguiente advertencia en '/ W4':' advertencia C4221: extensión no estándar utilizada: 'nxstate': no ​​se puede inicializar usando la dirección de la variable automática 'x''. El ensamblaje generado se ve bien, así que diría que puede confiar en esta característica incluso en MSVC. –

+2

Visual Studio no admitió oficialmente [C99 hasta 2013] (http://blogs.msdn.com/b/vcblog/archive/2013/07/19/c99-library-support-in-visual-studio-2013.aspx) Solo 14 años tarde. * golpea la cabeza * –

+1

que convoca a una fiesta! –

Cuestiones relacionadas