Perché dobbiamo scrivere un file di intestazione?


12

Prima di tirare fuori i tuoi commenti accidenti, lo so - questa è una domanda nooby. Questa è la prima volta che utilizzo un linguaggio basato su C.

Sono uno studente universitario che impara l'obiettivo C per un corso di informatica sullo sviluppo mobile. So che, in ambito accademico, non sono necessarie molte considerazioni nel mondo reale poiché stai costruendo progetti più piccoli, lavori in team più piccoli, ecc.

Ma il nostro professore richiede - e XCode supporta - file di intestazione .h per ogni file di implementazione .m. A me sembra un po 'un lavoro intenso. Devo assicurarmi di copiare ogni firma del metodo e ogni variabile di istanza sull'altro file. Se cambio un file, devo assicurarmi che sia coerente con l'altro file. Sembra solo un mucchio di piccoli fastidi del genere.

Ma so che ci deve essere un uso nel mondo reale per i file di intestazione. Un'ottima risposta potrebbe riguardare entrambi:

  1. A cosa serve un file di intestazione per cui un file di implementazione non è adatto? Qual è il suo scopo?
  2. Perché come programmatori dobbiamo scrivere manualmente i nostri file header? Sembra che possano essere facilmente generati automaticamente.

Grazie in anticipo!


XCode supporta il refactoring automatico in modo tale che se si modifica una firma nell'intestazione, questa viene propagata automaticamente all'implementazione (e viceversa)? O forse c'è un plugin che lo supporta? So che è un dolore fare manualmente.
FrustratedWithFormsDesigner,

La mia prima reazione quando ho saputo dei file di intestazione è stata "ci deve essere un modo per farlo automaticamente". Ero piuttosto perplesso quando ho provato a cercare uno strumento che mi avrebbe aiutato e non ho trovato grandi e ovvie scelte.
Hartley Brody,

Sono sorpreso che tale funzionalità non esista. So che Eclipse può eseguire questo refactoring per Java, non so se i plugin C / C ++ possano eseguire il refactoring header / impl. Suppongo che se non esiste uno strumento simile per XCode, potrebbe essere qualcosa che valga la pena sviluppare. ;)
FrustratedWithFormsDesigner

Risposte:


9
  1. In breve;

    • Il file di intestazione definisce l'API per un modulo. È un elenco di contratti che i metodi che una terza parte può chiamare. Il modulo può essere considerato una scatola nera per terzi.

    • L'implementazione implementa il modulo. È l'interno della scatola nera. Come sviluppatore di un modulo devi scrivere questo, ma come utente di un modulo di terze parti non dovresti avere bisogno di sapere nulla sull'implementazione. L'intestazione dovrebbe contenere tutte le informazioni necessarie.

  2. Alcune parti di un file di intestazione potrebbero essere generate automaticamente - le dichiarazioni del metodo. Ciò richiederebbe di annotare l'implementazione poiché è probabile che ci siano metodi privati ​​nell'implementazione che non fanno parte dell'API e non appartengono all'intestazione.

I file di intestazione a volte contengono altre informazioni; definizioni di tipo, definizioni costanti ecc. Queste appartengono al file header e non all'implementazione.


Ma quando qualcuno si troverebbe in una situazione in cui doveva usare il mio codice, ma aveva accesso solo al file .h? Non avrebbero ancora bisogno del .m per eseguirlo?
Hartley Brody,

1
Comprendo la necessità di astrazione a livello teorico, nel caso in cui si modificano i dettagli di implementazione, ma non sono sicuro di quando si presenterà una situazione del genere.
Hartley Brody,

10
A volte, di solito per motivi commerciali, potresti voler consentire a qualcuno di utilizzare il tuo codice, ma non avere accesso alla tua implementazione. In questo caso dovresti fornire un file di intestazione e una libreria o un codice oggetto che è già stato compilato.
Luke Graham,

Ah! Capisco. Non avevo considerato che il codice sarebbe già stato compilato, quindi utilizzabile ma non leggibile. Grazie!
Hartley Brody,

3
Inoltre, perché dovrei voler leggere l'implementazione per sapere come usare il tuo codice? Dovrebbe essere sufficiente leggere il file di intestazione.
Per Johansson,

5

Il motivo principale di un'intestazione è riuscire ad #includeesso in qualche altro file, quindi è possibile utilizzare le funzioni in un file da quell'altro file. L'intestazione include (solo) abbastanza per essere in grado di utilizzare le funzioni, non le funzioni stesse, quindi (speriamo) la compilazione è considerevolmente più veloce.

Mantenere separatamente i due risultati più numerosi da nessuno che abbia mai scritto un editor che automatizza molto bene il processo. Non ci sono davvero molte ragioni per cui non sono riusciti a farlo, e alcuni ci hanno persino provato, ma gli editori che lo hanno fatto non hanno mai fatto molto bene sul mercato, e gli editori più mainstream non l'hanno adottato.


2

L'inclusione di un'intestazione consente al codice di chiamare funzioni o metodi scritti altrove e che possono o meno essere parte del progetto / build del software, ma che possono essere trovati dal "linker" durante la creazione del software.

Ad esempio, quando chiami una funzione nella libreria C standard, non vuoi inserire tutte le interiora di quella funzione all'interno del tuo progetto - ti aspetti semplicemente che il tuo programma sia in grado di chiamarla.

Ma al tuo compilatore deve essere detto che la funzione esiste da qualche parte anche se non riesce a vedere il codice e l'intestazione lo fa. Quando il compilatore è terminato, viene chiamato il linker e sembra "collegare" quei bit del codice che vengono lasciati in sospensione, come le chiamate in libreria.


1

I file di intestazione vengono utilizzati principalmente per dichiarare e includere le firme (ovvero nome della funzione, valore di ritorno e argomenti) delle funzioni in altri file. Il compilatore deve conoscere queste firme durante la compilazione e il collegamento dei file.

Leggi questo articolo per ulteriori informazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.