2012-10-05 11 views
13

Possible Duplicate:
Error “initializer element is not constant” when trying to initialize variable with constelemento Initializer non è costante in C

vengo da JavaScript/PHP/Python e probabilmente mi manca qualcosa, ecco il codice:

const int a = 50; 
const int c = 100; 
const int d = 100; 
int endX = c + a; 
int endY = d; 
int startX, startY, b; 

ottengo

ex1.4.c:6: error: initializer element is not constant
ex1.4.c:7: error: initializer element is not constant

Qualcuno ha una spiegazione?

+1

sguardo al pannello sulla destra di questa domanda a questo è stato chiesto molte volte prima. Si prega di cercare questo sito prima di chiedere. –

+0

Posso compilare il tuo codice bene. quale compilatore/sistema stai usando? – none

+0

@gokcehan: stai usando un compilatore C++, per caso? –

risposta

4

Se si dichiara endX come variabile globale, l'errore ha senso.

Il motivo è che le variabili globali sono inizializzate in fase di compilazione e si sta tentando di inizializzare endX come un'operazione che deve essere eseguita in tempo di esecuzione.

+4

-1. Questa risposta è sbagliata. Non c'è nulla che impedisca al compilatore di calcolare endX prima del tempo di esecuzione. In effetti, g ++ li compilerà felicemente. È solo GCC che è eccessivamente irritabile su ciò che accetterà. – weberc2

2

Sì, non è possibile inizializzare qualcosa su una variabile. Il compilatore esegue l'inizializzazione e al momento della compilazione non conosce il valore di c+a;

L'inizializzazione del tipo int x = 1; va bene, il compilatore inserisce semplicemente 1 nell'indirizzo di x nel codice oggetto.

Per inizializzare qualcosa su c+a, si desidera farlo in fase di esecuzione, nel codice di avvio in c o nel costruttore C++.

0

Nei linguaggi di programmazione C, gli oggetti con durata di archiviazione statica devono essere inizializzati con espressioni costanti (o aggregato contenente espressioni costanti). Se endX ha una durata di archiviazione statica, il suo inizializzatore (c+a) non è un'espressione costante (vale a dire che l'espressione non può essere valutata durante la fase di traduzione).

15

Sfortunatamente, in C const le variabili non sono realmente costanti.

Di seguito sono riportati gli estratti dello standard C99.

6.7.8 Initialization

  1. All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

Le costanti sono definite come segue:

6.4.4 Constants

Syntax

constant:

integer-constant  (e.g. 4, 42L) 
floating-constant  (e.g. 0.345, .7) 
enumeration-constant (stuff in enums) 
character-constant  (e.g. 'c', '\0') 

Lo standard definisce espressioni costanti come segue:

6.6 Constant expressions

(7) More latitude is permitted for constant expressions in initializers. Such a constant expression shall be, or evaluate to, one of the following:

— an arithmetic constant expression,

— a null pointer constant,

— an address constant, or

— an address constant for an object type plus or minus an integer constant expression.

(8) An arithmetic constant expression shall have arithmetic type and shall only have operands that are integer constants, floating constants, enumeration constants, character constants, and sizeof expressions. Cast operators in an arithmetic constant expression shall only convert arithmetic types to arithmetic types, except as part of an operand to a sizeof operator whose result is an integer constant.

Così, c e a non sono espressioni costanti e non possono essere utilizzati come inizializzatori nel tuo caso.

5

const le espressioni devono essere una costante di tempo di compilazione in C a differenza di C++, pertanto c+a non può essere utilizzato come costante. Il solito modo per gestire questo problema in C è quello di utilizzare il preprocessore invece:

#define A 50 
#define C 100 
#define D 100 
int endX = C + A; 
int endY = D; 
int startX, startY, b; 
+1

se 'c' e' a' sono costanti di tempo di compilazione, allora 'c + a' è pure (e qualsiasi cosa a cui è assegnata quell'espressione). Non è che C++ non richieda che le espressioni const siano costanti in fase di compilazione; è che C++ è abbastanza intelligente da comprendere che 'const int + const int' è una costante di tempo di compilazione, mentre C non è così intelligente. – weberc2

Problemi correlati