Domanda

Non capisco bene lo scopo di avere un'intestazione;sembra violare il principio DRY!Tutte le informazioni in un'intestazione sono (possono essere) contenute nell'implementazione.

È stato utile?

Soluzione

Si semplifica il processo di compilazione. Quando si desidera compilare le unità in modo indipendente, avete bisogno di qualcosa per descrivere le parti che saranno collegati a senza dover importare l'insieme di tutti gli altri file.

Permette anche per il codice nascosto. Si può distribuire un'intestazione per permettere ad altri di utilizzare la funzionalità senza dover distribuire l'applicazione.

Infine, può favorire la separazione di interfaccia dall'implementazione.

Non sono l'unico modo per risolvere questi problemi, ma 30 anni fa erano una buona. Probabilmente non ci utilizzare i file di intestazione per un linguaggio di oggi, ma non sono stati inventati nel 2009.

Altri suggerimenti

Gli architetti di molti linguaggi moderni come Java, C # Eiffel e sono d'accordo con voi in modo chiaro - queste lingue estrarre i metadati di un modulo dalla implementazione. Tuttavia, di per sé, il concetto di intestazioni non esclude che - sarebbe ovviamente un compito semplice per un compilatore per estrarre un file .h durante la compilazione di un .c, ad esempio, proprio come i compilatori per quelle altre lingue fanno implicitamente. Il fatto che i compilatori C tipici attuali non lo fanno, non è un problema di progettazione lingua - si tratta di un problema di implementazione; a quanto pare non c'è domanda da parte degli utenti per una tale funzione, in modo che nessun produttore del compilatore dà fastidio la sua attuazione.

Come una scelta di design lingua, avendo i file .h separati (in un formato di testo leggibile e modificabile) ti dà il meglio di entrambi i mondi: si può iniziare a parte la compilazione di codice client basato su un'implementazione modulo che ancora non esiste , se lo si desidera, scrivendo il file .h a mano; oppure (supponendo per assurdo un'implementazione compilatore che lo alimenta ;-) può ottenere automaticamente il file .h dall'attuazione come effetto collaterale di compilarlo.

Se C, C ++, ecc, mantenere fiorente (a quanto pare stanno ancora facendo bene oggi ;-), e la domanda come la tua per non manualmente le intestazioni di scrittura si sviluppa, alla fine compilatore scrittori dovranno fornire l'opzione "generazione di testa", e il "meglio dei due mondi" non resterà teorica -!)

È utile pensare un po' alle capacità dei computer che erano disponibili quando, ad esempio, fu scritto il c.La memoria principale veniva misurata in kiloparole, e non necessariamente moltissime.I dischi erano più grandi, ma non molto.L'archiviazione seria significava nastri da bobina a bobina, montati a mano, da operatori scontrosi, che volevano davvero che tu andassi via per poter giocare a caccia al wumpus.Una macchina da 1 MIPS era urlando velocemente.E con tutte queste limitazioni dovevi farlo condividere Esso.Possibilmente con una ventina di altri utenti.

Tutto ciò che riduceva lo spazio O la complessità temporale della compilazione è stata una grande vittoria.E le intestazioni fanno entrambe le cose.

Non dimenticare la documentazione fornisce un colpo di testa. Di solito c'è niente in esso che dovete sapere per usare il modulo. Io per parte mia non voglio per eseguire la scansione attraverso un codice sorgente luuungo per imparare che cosa c'è che ho bisogno di utilizzare e come definirlo ... Si potrebbe estrarre queste informazioni in ogni caso, che si traduce in modo efficace - un file di intestazione. Non è più un problema con l'IDE moderno, naturalmente, ma lavorare con un po 'di vecchio codice C ho davvero l'amore per avere i file di intestazione artigianali che includono osservazioni circa l'utilizzo e circa pre e post-condizioni.

Mantenere fonte, intestazione e ulteriore documentazione in sincronia ancora è un altro vaso di Pandora ...

L'intera idea di ispezionare i file di output binari di processori lingua sarebbe stato difficile da comprendere quando C inventato file .h. C'era un sistema chiamato JOVIAL che ha fatto qualcosa di simile, ma era esotica e confinato più- o meno esclusivamente ai progetti militari. (Non ho mai visto un programma gioviale, ho sentito solo su di esso.)

Così, quando C è uscito il modello di progettazione di consueto per la modularità è stato "nessun tipo di controllo". Ci potrebbe essere una restrizione che .text simboli poteva solo link alla .text e .data per .data, ma questo è tutto. Cioè, i compilatori della giornata tipicamente elaborate un file sorgente alla volta e poi linkers metterli insieme senza il minimo livello di controllo degli errori diverso, se siete stati fortunati, "Sono un simbolo di funzione" vs "Sono un simbolo di dati".

Quindi, l'idea di avere effettivamente il compilatore a capire la cosa si stava chiamando era un po 'nuova.

Anche oggi, se si effettua un colpo di testa completamente fasulli, nessuno ti cattura nella maggior parte AOT compilatori . cose intelligenti come lingue CLR e Java effettivamente fare le cose codificare nei file di classe.

Quindi sì, nel lungo periodo, probabilmente non avremo file di intestazione.

No non avete le intestazioni in Java - ma avete interfacce e io ogni serio guru Java, si consiglia di definire nulla utilizzato da altri progetti / sistemi come un'interfaccia e un'implementazione

.

Vediamo un'interfaccia Java definizione contiene firme di chiamata, le definizioni di tipo e contants.

La maggior parte file header C contengono le firme di chiamata, definizioni di tipi e le costanti.

Quindi, per tutti gli scopi pratici C / C ++ file header sono solo definizioni di interfaccia e dovrebbero quindi essere considerati una buona cosa. Ora so che la sua possibile definire una miriade di altre cose in file di intestazione, nonché (MARCROs, costanti ecc ecc), ma che solo una parte di tutto il meraviglioso mondo di C: -

int function target () {
    // Default for shoot
    return FOOT;
}

Per Particolare Leggi questo

Un file di intestazione comunemente contiene delle dichiarazioni di classi, sottoprogrammi, variabili e altri identificatori. I programmatori che desiderano dichiarare identificatori standardizzati in più di un file sorgente possono collocare tali identificatori in un unico file di intestazione, che altro codice può quindi includere ogni volta che è necessario il contenuto di intestazione.

La libreria standard C e libreria standard C ++ tradizionalmente dichiarano le loro funzioni standard nel file di intestazione.

E se si vuole dare qualcun altro le dichiarazioni di utilizzare la libreria senza dare loro l'attuazione?

Come un'altra risposta sottolinea - il motivo originale per le intestazioni era di fare il parsing / compilazione più semplice su piattaforme con strumenti molto semplici e limitati. E 'stato un grande passo in avanti per avere una macchina con 2 dischi magnetici così si potrebbe avere il compilatore su uno e il codice sugli altri -. Reso le cose molto più facili

Se si divide il codice nei file di intestazione e di origine si divide dichiarazione e definizione. Quando si guarda nel file di intestazione è possibile vedere quello che hai e se bacchetta per visualizzare i dettagli di implementazione di andare a fonte di file.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top