2015-06-23 12 views
9

const variabili in C++ devono essere inizializzate significa che uninitialized const variable non è possibile & si tratta di un errore del compilatore. Ma perché non è lo stesso anche in linguaggio C? Considerare seguente programma che compila bene C:Perché la variabile const non deve essere inizializzata in C?

#include <stdio.h> 
int main() 
{ 
    const int a; 
} 

Qual è la ragione per consentire uninitialized const? Non sarebbe carino se anche C seguisse la stessa regola del C++? È a causa di problemi di prestazioni che la variabile const locale deve essere inizializzata ogni volta che una funzione viene chiamata l'inizializzazione & richiede tempo?

+0

** Nota del moderatore **: utilizzare i commenti per richiedere chiarimenti/discutere la domanda posta. Grazie. –

risposta

3

La differenza deriva probabilmente, tra le altre cose, da un approccio significativamente più rilassato all'inizializzazione in linguaggio C in generale, non solo per quanto riguarda gli oggetti const. Ad esempio, questo codice è illegale in C++

goto over; 
int a = 5; 
over:; 

perché salta in ambito di a bypassando sua inizializzazione. Nel frattempo in C questo codice è perfettamente legale, con variabile a con valore indeterminato a over:.

La stessa logica si applica alla dichiarazione const int a. Il linguaggio C crede semplicemente che un oggetto non inizializzato non sia un grosso problema, anche in situazioni in cui non è più possibile impostarlo successivamente su un valore determinato.

Il motivo principale per i requisiti di inizializzazione più stringenti in C++ è l'introduzione di inizializzazioni non banali (costruttori) nel linguaggio, ovvero un'inizializzazione che non può essere ignorata in modo significativo. Gli oggetti scalari e la loro inizializzazione in C++ sono stati etichettati come una piccola parte di un concetto molto più ampio.

Non sarebbe bello Se anche C segua la stessa regola del C++?

Non lo vedo. C e C++ sono lingue sostanzialmente diverse. E trattano allo stesso modo const in modo diverso.

3

Cronologia.

const è stato specificato in C++ dall'inizio e l'utilizzo ha soddisfatto gli obiettivi di quella lingua. const è stato successivamente specificato in C ma con un significato correlato ma diverso per ridurre al minimo i problemi di compatibilità del codice C in uscita.

Poiché C è stato avviato senza const, la sua inclusione successiva è più simile a un modificatore read-only che a uno constant. Ciò ha consentito ai compilatori esistenti di considerare essenziale const come nulla per la scrittura su un const comportamento non definito. I compilatori/codici più recenti potrebbero sfruttare il vantaggio offerto da const.

const int a; 
a = 5; // problem in C as code attempts to write `a` 

// Really should be `const char *fred`, but allowed for backwards compatibility. 
char *fred = "sally"; 

C++ ha preso un approccio più forte e richiede l'inizializzazione.

Vedi anche const in C vs const in C++

0

Credo che la ragione è convenzione.

In C, praticamente nessun tipo di oggetto è mai necessaria essere inizializzato, e non è mai stato richiesto essere inizializzato.

const oggetti sono solo un altro tipo di oggetto con una caratteristica speciale, perché fare un'eccezione per loro?

1

Perché C è assolutamente fiducioso nel programmatore e gli consente di fare un sacco di cose tra cui quelle stupide: int *x = NULL; x[4] = 12; verrà compilato senza errori e anche senza avvisi da molti compilatori.

Più precisamente, const è solo una promessa che il programmatore fa che la variabile non debba essere modificata e che il compilatore possa considerarlo costante se è in grado di aiutare le ottimizzazioni. Ma compilatore non potrà mai far rispettare tutte le regole fase di esecuzione per proibire per modificare un valore const:

const a = 1; 
int *ix = (int *) &a; 
*ix = 2; 
printf("a=%d\n", a); /* UB : could print 1 or 2 */ 

verrà compilato senza un avvertimento. Ma invocherà un comportamento indefinito perché hai modificato un oggetto dichiarato come const.

Credo che non sia possibile inizializzare le variabili const semplicemente perché l'attuale specifica C non lo impedisce! Nelle precedenti versioni, l'inizializzazione è sempre facoltativa. Forse le versioni future potrebbero forzare l'inizializzazione per le variabili automatiche

In ogni caso, una variabile const globale o statica viene infatti automaticamente inizializzata (per le specifiche del linguaggio C 6.7.9 10): Se un oggetto con durata di memorizzazione statica o di thread non è inizializzato in modo esplicito , quindi: ... se ha un tipo aritmetico, viene inizializzato su zero (positivo o senza segno); ...

Così static const a; è perfettamente valido come è const a se a è globale e in quelli caso a=0.

+0

È anche possibile che alcuni sistemi di compilazione possano definire i mezzi attraverso i quali le cose che saranno costanti una volta avviato il programma potrebbero essere modificate tra la compilazione e l'esecuzione (ad esempio da un'utilità che legge la mappa dei collegamenti e patch l'eseguibile). Lo standard C non fornisce alcun mezzo attraverso il quale ciò possa accadere, ma non c'è motivo per vietare un costrutto che potrebbe essere reso utile con tali mezzi. – supercat

Problemi correlati