Sto iniziando a mettere in discussione l'utilità della parola chiave "extern" che viene utilizzata per accedere a variabili/funzioni in altri moduli (in altri file). Non stiamo facendo la stessa cosa quando usiamo il preprocessore #include per importare un file di intestazione con prototipi di variabili/funzioni o definizioni di funzioni/variabili?Qual è la differenza tra l'uso dei file di intestazione extern e #including?
risposta
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.
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.
- 1. Qual è la differenza tra file di intestazione e spazio dei nomi?
- 2. C: Qual è l'uso di "extern" nei file di intestazione?
- 3. Qual è la differenza tra `extern int (x) []` e `extern int x []` in C?
- 4. qual è la differenza tra i file di intestazione c (.h) e i file di intestazione C++ (.hpp)
- 5. Qual è la differenza tra aar e file di guerra?
- 6. Qual è la differenza tra TCHAR e WCHAR?
- 7. Qual è la differenza tra Verilog! e ~?
- 8. Qual è la differenza tra $ e $$?
- 9. Qual è la differenza tra {0} e +?
- 10. Qual è la differenza tra = e: =
- 11. Qual è la differenza tra ("") e (null)
- 12. Qual è la differenza tra dict() e {}?
- 13. Qual è la differenza tra i file apklib e jar?
- 14. Qual è la differenza tra i file .lib e .a?
- 15. Qual è la differenza tra? : e ||
- 16. qual è la differenza tra [[], []] e [[]] * 2
- 17. Qual è la differenza tra " " e ""?
- 18. Qual è la differenza tra {0} e ""?
- 19. Qual è la differenza tra `##` e `hashCode`?
- 20. Qual è la differenza tra .ToString() e + ""
- 21. qual è la differenza tra:.! e: r !?
- 22. Qual è la differenza tra i file .class e .dex?
- 23. Qual è la differenza tra% e %% in un file cmd?
- 24. Qual è la differenza tra. e # in un file css?
- 25. Qual è la differenza tra i file .htc e .js?
- 26. `static`,` extern`, `const` nel file di intestazione
- 27. Qual è la differenza tra file: /, file: //, file: ///
- 28. Qual è la differenza tra l'uso e l'extern?
- 29. Che cos'è "intestazione HTTP non elaborata"? Qual è la differenza tra "intestazione HTTP" e "intestazione HTTP non elaborata"?
- 30. Qual è la differenza tra l'intestazione Etag e Expires?
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? –
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
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. –