2013-08-02 16 views

risposta

7

La parola chiave extern significa "dichiarazione senza definizione". In altre parole, è un modo per dichiarare esplicitamente una variabile o forzare una dichiarazione senza una definizione.

Quindi in file2, hai appena dichiarato la variabile senza definizione (nessuna memoria allocata). In file1, hai dichiarato e definito una variabile di tipo integer. Qui è stata allocata memoria su BSS segment perché si dispone di un globale non inizializzato (per C).

In C++, le informazioni globali sono memorizzate in un'area di dati per processo .


differenza tra dichiarazione e definizione:

Per comprendere come le variabili esterne riferiscono alla parola extern, è necessario conoscere la differenza tra la definizione e dichiara una variabile.

Quando una variabile è definita, il compilatore alloca la memoria per quella variabile e, eventualmente, inizializza anche il suo contenuto su un valore. Quando viene dichiarata una variabile, il compilatore richiede che la variabile sia definita altrove.

La dichiarazione informa il compilatore che esiste una variabile con quel nome e tipo, ma il compilatore non deve allocare memoria perché è allocata altrove.

+0

Ciao Pierre, grazie per aver chiarito il dubbio. Ma come nel file 1, var 'a' è globale e memorizza la memoria nel segmento di dati, quindi sarà nel segmento di dati o come hai menzionato nello stack? Non sono chiaro con questo. puoi spiegare per favore. – anand

+0

Nel tuo caso è nel [segmento BSS] (http://en.wikipedia.org/wiki/Data_segment) perché è una variabile globale inizializzata. –

+0

Non esiste un segmento BSS nel C++ standard. –

5

In fascicolo 2 è stato dichiarato una variabile di tipo intero chiamato a (ricordate definizione cioè senza allocazione di memoria per a finora). E possiamo fare questa dichiarazione tutte le volte che è necessario. Dove si trova nel file una variabile di tipo intero denominata a è stata dichiarata e definita. (ricorda che la definizione è il super set di dichiarazione). Qui viene allocata anche la memoria per a.

+0

Grazie a @hitesh, puoi dirmi in quale memoria del segmento di memoria verrà assegnato? sarà nel segmento Data in quanto sarà globale per il file 1? E se non includiamo il file 1 nel file 2, come #include , allora darà qualche errore? – anand

+0

Ciò genera errore nella compilazione. Perché var è dichiarato ma non definito da nessuna parte. Se vuoi lavorare così bene senza includere 'file1.h' piuttosto che renderti variabile extern come' extern int a = 0; ' –

Problemi correlati