2010-02-02 14 views
15

Possibili duplicati:
[C] Header per source file.
In C++ why have header files and cpp files?
C++ - What should go into an .h file?Quali sono i punti dei file di intestazione in C?

è l'unica ragione per cui esistono i file header in C è così uno sviluppatore può rapidamente vedere quali funzioni sono disponibili, e quali argomenti possono prendere? O è qualcosa a che fare con il compilatore?

Perché in nessun altro linguaggio è stato utilizzato questo metodo? Sono solo io, o sembra che avere 2 set di definizioni di funzione porti solo a una maggiore manutenzione e più spazio per errori? O è a conoscenza dei file header semplicemente qualcosa che ogni sviluppatore C deve conoscere?

+1

La prima risposta a questo http://stackoverflow.com/questions/1167875/c-header-per-source-file copre ciò che desideri. –

+1

Un altro http://stackoverflow.com/questions/333889 –

+1

E http://stackoverflow.com/questions/1945846/c-what-should-go-into-an-h-file ... Davvero, perché questo è votato 3 volte? – MSalters

risposta

20

I file di intestazione sono necessari per dichiarare le funzioni e le variabili disponibili. Potresti non avere accesso alle definizioni (= file .c) per tutto; C supporta la distribuzione di codice solo binario nelle librerie.

+0

perché non esegue la scansione direttamente inclusi i file C inclusi per verificare cosa c'è dentro, questo è quello che non capisco. – chris

+0

@chris Come ho già detto, non è necessario avere il codice sorgente per una funzione che si desidera chiamare. E non è necessario che il formato binario di una piattaforma contenga informazioni che un compilatore può leggere, non è fatto in questo modo. Forse "stupidamente", ma è così che è. – unwind

7

Il motivo principale per cui esistono intestazioni è la condivisione di dichiarazioni tra più file di origine.

Diciamo che hanno la funzione di float *f(int a, int b) definita nel file a.c e riutilizzato in b.c e d.c. Per consentire al compilatore di controllare correttamente gli argomenti e restituire i valori, inserire il prototipo di funzione in un file di intestazione e includerlo nei file di origine .c o ripetere il prototipo in ciascun file di origine.

Lo stesso vale per typedef ecc

Mentre si potrebbe, in teoria, ripetere la stessa dichiarazione in ogni file sorgente, sarebbe diventato un vero e proprio incubo per gestire correttamente.

Alcune lingue utilizzano lo stesso approccio. Ricordo che le unità TurboPascal non erano molto diverse. Dovresti inserire use ... all'inizio per segnalare che avevi bisogno di funzioni definite altrove. Non ricordo se è stato passato anche a Delphi.

10

Il compilatore necessita delle informazioni nei file di intestazione per sapere quali funzioni, strutture, ecc. Sono disponibili e come utilizzarle.

Tutte le lingue richiedono questo tipo di informazioni, sebbene recuperino le informazioni in modi diversi. Ad esempio, un compilatore Java esegue questa operazione analizzando il file di classe o il codice sorgente java per recuperare le informazioni.

Lo svantaggio con Java-way è che il compilatore potenzialmente ha bisogno di contenere molte più informazioni nella sua memoria per poterlo fare. Questo non è un grosso problema oggi, ma negli anni settanta, quando fu creato il linguaggio C, semplicemente non era possibile conservare troppe informazioni in memoria.

+0

Sembra che la maggior parte dei nuovi linguaggi anche quelli compilati non si preoccupino più dei file di intestazione. Quindi diresti che i file header sono ridondanti al giorno d'oggi se dovessimo ricreare C? – CMCDragonkai

2
  1. Sapere cosa c'è in una libreria a vostra disposizione.
  2. Dividere il programma in blocchi di dimensioni morso per il compilatore. La compilazione simultanea di un megabyte di file C richiederà più risorse di quanto la maggior parte dell'hardware moderno possa offrire.
  3. Ridurre il carico del compilatore.Perché dovrebbe conoscere le procedure di visualizzazione dello schermo relative al motore di database in profondità? Lascia che impari solo le funzioni di cui ha bisogno ora.
  4. Dati privati ​​e pubblici separati. Questo uso non è frequente, ma è possibile implementare in C ciò che C++ utilizza per i campi privati: ogni file .c include due file .h, uno con dichiarazioni di materiale privato, l'altro con qualsiasi altro possa richiedere dal file. Meno possibilità di un conflitto nello spazio dei nomi, più sicuro a causa dell'ermetizzazione.
  5. Configurazioni alternative. Makefile decide quale intestazione usare, e lo stesso codice può servire due piattaforme diverse in base a due diversi file di intestazione.

probabilmente di più.

+0

"Perché dovrebbe sapere nelle procedure di visualizzazione dello schermo sul motore di database profondo" ... anche se, se questo è il caso dell'implementazione, il progetto probabilmente ha problemi più grandi rispetto alla creazione di risorse. –

+0

@CarlG: non hai mai programmato dispositivi embedded, vero? –

+0

No. Non è possibile modularizzare la visualizzazione dalla memorizzazione in tali sistemi? O semplicemente poco pratico? Avrei immaginato che un motore di database profondo sarebbe stato meglio trasferito su un sistema embedded separato o anche su un servizio (in rete?) Se possibile. –

Problemi correlati