2013-06-30 7 views
9

Ho dichiarato due variabili globali con lo stesso nome in C. Dovrebbe dare un errore in quanto non è possibile dichiarare le stesse variabili del nome nella stessa classe di memoria.Dichiarazione di due variabili globali con lo stesso nome in C

L'ho controllato in C++ - dà un errore di compilazione, ma non in C. Perché?

seguito è il codice:

int a; 
int a = 25; 
int main() 
{ 

    return 0; 
} 

controllo fuori a: Code Written at Ideone

Penso che questo è probabilmente il motivo per

Declaration and Definition in C

Ma questo non è il caso in C++ . Penso che in C++, indipendentemente dal fatto che la variabile sia dichiarata nell'ambito globale o dall'ambito automatico, la dichiarazione e la definizione avvengono contemporaneamente.

Qualcuno potrebbe gettare un po 'di luce su di esso.

Ora quando definisco la variabile due volte dandogli il valore due volte mi dà l'errore (invece di una dichiarazione e una definizione).

Codice: Two definitions now

int a; 
int a; 
int a; 
int a = 25; 

int main() 
{ 
return 0; 
} 
+0

@ H2CO3 .. grazie per il tuo suggerimento ma stavo solo cercando di capire cosa stesse succedendo. Ma ci sono alcune situazioni in cui non puoi nemmeno evitare di usare le variabili globali. –

risposta

8

In C, più variabili globali sono "fuse" in uno. Quindi hai effettivamente una sola variabile globale, dichiarata più volte. Ciò risale al momento in cui extern non era necessario (o forse non esisteva - non del tutto sicuro) in C.

In altre parole, questo è valido in C per ragioni storiche in modo che possiamo ancora compilare il codice scritto prima c'era uno standard ANSI per C.

Sebbene, per consentire l'uso del codice in C++, suggerirei di evitarlo.

+0

Non è stato possibile ottenere l'istruzione "Più variabili globali sono unite" in una. Ora ho definito anche il primo, e ora il suo errore di compilazione. –

+1

In altre parole, tutte le variabili globali con lo stesso nome essere convertito in una variabile - quindi il tuo 'int a;' e 'int a = 25;' si riferiranno allo stesso pezzo di memoria 'int'. –

+0

Formalmente chiamato * definizione provvisoria * in C. Puoi tentativamente definisci un oggetto tutte le volte che vuoi in una singola unità di traduzione e saranno "uniti" e il tipo risultante è il composto di tutte le definizioni provvisorie. Nel tuo caso, è solo "int". –