2015-04-30 10 views
5

Compilando il seguente codice con gcc.Perché non è possibile in C inizializzare una costante con un'altra costante?

Codice:

#include <stdio.h> 
const int i = 10; 
const int n = i+1; 
int main() { 
    printf("%i\n", i); 
    printf("%i\n", n); 
} 

Errore:

ottengo un errore di compilazione come qui di seguito

test.c:3:5: error: initializer element is not constant 
const int n = i+1; 
^ 

compilazione con g ++ funziona bene e stampa 10 e 11.

Ho usato gcc 4.9.2

+4

Forse vedi questa risposta: http://stackoverflow.com/a/3025106/4384927 – Chostakovitch

risposta

0

static le variabili devono essere inizializzate con una costante.
Un compilatore C++ lo compilerà perché in C++ le variabili qualificate sono costanti const. In C, le variabili qualificate const non sono costanti e un compilatore C genera un errore.

+1

Ma 'g ++' calcola 'i + 1' in fase di compilazione apparentemente. – Thilo

+4

@Thilo g ++ è un compilatore C++ e in C++ le regole per le costanti sono diverse. In C++ una costante può essere inizializzata con un valore valutato in fase di esecuzione. Const in C++ significa che una volta inizializzato non puoi più modificarne il valore. – rozina

+0

@rozina: Ma non è questo il caso. In questo caso (per C++), 'i + 1' viene valutato al momento della compilazione. 'i',' i + 1', e 'n' sono tutte espressioni costanti di tempo di compilazione in questo codice. –

1

const variabile può essere initalizzata con valori costanti (espressioni costanti).


  • In C

al momento della compilazione, i + 1 non è un'espressione costante.

FWIW, anche

const int n = i; 

vi darà errore, perché, anche se dichiarato come const, i non può essere utilizzato come costante espressione da utilizzare come initalizer ad un altro const.


  • In C++ variabili

const vengono battistrada espressione come costante se sono inizializzati con espressioni costanti. Quindi, questo è permesso.

+1

Ma g ++ calcola i + 1 in fase di compilazione apparentemente. – Thilo

+1

@Thilo Bene, in tal caso, 'C' e' C++ 'sono lingue diverse e vengono trattate in questo modo. –

+2

* "le variabili const sono battistrada come espressione costante" * - * Se * sono inizializzate con espressioni costanti. –

Problemi correlati