2008-10-02 5 views
8

J'ai dans une fonction qui prend une structure, et j'essaie de stocker ses variables dans un tableau, mais je l'ai quand je lance gcc -Wall -ansi -pedantic -errors -WerrorErreur: l'élément d'initialisation n'est pas calculable au moment du chargement

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

    return 0; 
} 

je reçois erreur: élément initialiseur n'est pas calculable au moment du chargement lorsque je tente de compiler ce qui précède. Ça me va bien, quel est le problème?

Répondre

11

Ceci est illégal dans C. Les listes d'initialisation doivent être des expressions de compilation constantes. Au lieu de cela, procédez comme suit:

int prm_arr[3]; 

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

Illégal dans C89 qui est le standard implicite par -ansi; légal dans C99, qui peut être activé en utilisant -std = c99 au lieu de -ansi. –

15

La réponse de Mike est tout à fait correcte. Cependant, si vous êtes en mesure d'utiliser les extensions GNU C ou d'utiliser à la place la nouvelle norme C99 (utilisez l'option --std=c99), les initialiseurs comme celui-ci sont parfaitement légaux. La norme C99 est sortie depuis 9 ans, et la plupart des compilateurs C la supportent très bien ... surtout cette fonctionnalité.

+0

Just FYI, Visual Studio 2008 (qui ne supporte officiellement que C89) émet l'avertissement suivant à '/ W4':' warning C4221: extension non standard utilisée: 'nxstate': ne peut pas être initialisée avec l'adresse de la variable automatique 'x''. L'assemblage généré semble bien, donc je dirais que vous pouvez compter sur cette fonctionnalité même dans MSVC. –

+2

Visual Studio n'a pas officiellement pris en charge [C99 jusqu'en 2013] (http://blogs.msdn.com/b/vcblog/archive/2013/07/19/c99-library-support-in-visual-studio-2013.aspx). Seulement 14 ans de retard. * bangs head * –

+1

qui appelle à une fête! –

Questions connexes