‘Initializer not constant’ sur la variable globale?

J’obtiens donc l’erreur ‘initializer element not not constant’ lors de la compilation du code suivant:

#include  #include  #include  float wl = 2.0f; float k = 2.0f * (float) M_PI / wl; int main () { //Do stuff } 

Si je déplace "float k" dans la méthode principale, il n’y a pas d’erreur, mais ce n’est pas une option pour moi, car j’ai BESOIN de ce que k soit une variable globale. Même si je le change en ceci:

 const float wl = 2.0f; const float k = 2.0f * (float) M_PI / wl; 

l’erreur se produit toujours. Comment puis-je réparer ça?

Global variables Global et static sont stockées dans le segment de données (DS) lors de l’initialisation et dans le bloc début par symbole (BSS) lorsqu’elles ne sont pas initialisées. Ces variables ont un emplacement mémoire fixe et la mémoire est allouée au moment de la compilation.
C ne permet pas l’initialisation de valeurs globales avec des valeurs non constantes.

 C99 Standard: Section 6.7.8: All the expressions in an initializer for an object that has static storage duration shall be constant expressions or ssortingng literals. 

Vous devez déplacer l’initialisation dans la déclaration de conservation main en tant que global.

 float wl = 2.0f; float k ; int main () { k = 2.0f * (float) M_PI / wl; //Do stuff } 

Selon la norme C99:

§ 6.7.8 Initialisation

  1. Toutes les expressions dans un initialiseur pour un object ayant une durée de stockage statique doivent être des expressions constantes ou des littéraux de chaîne .

L’utilisation de const n’aide pas ici car, en C, les variables const ne sont pas vraiment const. Consultez ce post pour plus de détails.


Pour wl ce wl , vous pouvez rendre wl constant à l’aide du préprocesseur :

 #define wl 2.0f 

En faisant cela, 2.0f * (float) M_PI / wl peut être une constante de temps de compilation.

Au-dessus de moi, @GoldRanger a correctement cité le standard, expliquant ainsi le problème que vous rencontrez. Techniquement, puisque vous avez une variable dans l’initialisation de k elle est considérée comme non-constant .

Pour append un contexte, je vais mettre ceci ici:

Lorsque le programme est compilé, il place les variables globales dans leur propre section du binary (je ne connais pas trop les formats exécutables sous Linux ni Windows, mais sous mac, ils sont placés dans le segment __DATA). Donc, quand vous mettez cette ligne float k = 2.0f * (float) M_PI / wl; le compilateur n’est pas assez intelligent * pour reconnaître que wl est en fait une constante lors de la compilation et que vous souhaitez que k soit initialisé avec la valeur initiale de wl .

* smart n’est pas exactement la bonne description ici. En général, puisque wl n’est pas déclaré en tant que const, l’expression n’est pas exactement une expression constante. Le compilateur n’en sait donc rien. Je suppose que ceci est peut-être une question de sémantique ou peut-être juste juste me disputer avec moi-même sur la formulation que j’ai utilisée.

Afin de faire ce que vous essayez de faire, j’utilise habituellement une #define pour ma constante initiale qui sera utilisée tout au long du programme:

 #define kwlconst 2.0f float wl = kwlconst; float k = 2.0f * (float) M_PI / kwlconst;