2009-08-25 14 views

risposta

17

extern è necessario perché dichiara che il simbolo esiste ed è di un certo tipo e non alloca memoria per esso.

Se lo fai:

int foo; 

In un file di intestazione che è condiviso tra più file di origine, si otterrà un errore di linker, perché ogni fonte avrebbe la propria copia di foo creato e il linker sarà in grado per risolvere il simbolo.

Invece, se si dispone di:

extern int foo; 

Nell'intestazione, avrebbe dichiarato un simbolo che è definito altrove in ogni file sorgente. file sorgente

One (e uno solo) dovrebbe contenere

int foo; 

che crea una singola istanza di foo per il linker di risolvere.

+2

Ma non si può ancora accedere a int foo senza dichiarare con extern int foo fintanto che si include il file di intestazione contenente la sua definizione? –

+2

Come jcopenha menzionato, # include solo il testo dal file incluso nel file sorgente - il compilatore non è realmente a conoscenza dei file include e non li tratta in modo speciale. Quindi se hai A.c, B.c e C.c, ognuno con "int foo" e li colleghi insieme, come risolvi il problema? Esiste in 3 diversi posti. extern significa solo che il simbolo esiste da qualche altra parte. Puoi usarlo, ma qualcun altro è responsabile della sua creazione. – Michael

+0

Troverete che per le funzioni in cui esiste solo un'istanza di programmi foo_fun() con moduli che chiamano foo_fun() funzionerà con o senza extern. Quindi in quei casi dovresti cercare di essere chiaro a riguardo. Quando entri in una variabile globale condivisa devi essere molto chiaro, alcuni compilatori lo capiscono, altri no. –

2

No. Il comando # include un comando per il preprocessore che dice "metti tutto il testo da questo altro file qui". Quindi, tutte le funzioni e le variabili nel file incluso sono definite nel file corrente.

Problemi correlati