2014-04-13 8 views
5

in modo da ottenere l' 'elemento inizializzatore non è costante' errore quando si compila il seguente codice:'Inizializzatore non costante' sulla variabile globale?

#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 

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

int main() 
{ 
    //Do stuff 
} 

Se mi muovo "float k" all'interno del metodo principale, non ci sono errori, ma questo non è un'opzione per me, perché HO BISOGNO di float k per essere una variabile globale. Anche se lo cambio a questo:

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

, l'errore si verifica ancora. Come posso risolvere questo?

+1

Considerare di assegnare il valore per 'k' all'interno di' main' all'inizio, pur dichiarandolo come variabile globale senza inizializzazione. – ThoAppelsin

risposta

2

Global e static le variabili sono memorizzate in Segmento dati (DS) quando inizializzato e Blocca inizio da simbolo (BSS) quando non inizializzato. Queste variabili hanno una posizione di memoria fissa e la memoria viene allocata in fase di compilazione.
C non consente l'inizializzazione di valori globali con valori non costanti.

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 string literals. 

è necessario spostare l'inizializzazione all'interno della dichiarazione main tenuta come globale

float wl = 2.0f; 
float k ; 

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

Grazie per l'aiuto! –

0

Sopra di me @GoldRanger ha accuratamente citato lo standard in tal modo spiegare il problema riscontrato. Tecnicamente dal momento che hai una variabile nell'inizializzazione di k è considerata non-constant.

Per aggiungere un po 'di contesto metto questo qui:

Quando il programma viene compilato mette le variabili globali nella loro propria sezione del binario (Io non sono troppo familiarità con Linux o Windows formati eseguibili, ma su mac sono messi nel segmento __DATA). Quindi quando metti quella riga float k = 2.0f * (float) M_PI/wl; il compilatore non è intelligente * abbastanza da riconoscere che wl è in realtà una costante al momento della compilazione e che vuoi che venga inizializzato con il valore iniziale di wl.

* smart non è esattamente la descrizione corretta qui. In generale poiché wl non è dichiarato come const, l'espressione non è esattamente un'espressione costante in generale, quindi il compilatore non ne sa nulla. Suppongo che forse questo è un problema di semantica o forse solo io a discutere con me stesso sulla formulazione che ho usato.

Al fine di fare ciò che si sta cercando di fare io di solito uso un #define per il mio costante iniziale che verrà utilizzato in tutto il programma:

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

Secondo C99 serie:

§6.7.8 Inizializzazione

  1. Tutte le espressioni in un inizializzatore per un oggetto che ha durata di memorizzazione statica deve essere espressioni costanti o stringa letterali.

Utilizzando const non aiuta qui perché, in C, const variabili non sono realmente const. Controlla this post per maggiori dettagli.


a lavorare fuori, si può fare wl costante utilizzando preprocessore:

#define wl 2.0f 

In questo modo, 2.0f * (float) M_PI/wl può essere una costante di tempo di compilazione.