Perché dobbiamo includere più file di intestazione per una singola libreria (la libreria standard C)?

2

Non sono sicuro del motivo per cui ci sono così tanti file di intestazione per la libreria standard C (stdio.h, stdlib.h, math.h).

In che modo questi file di intestazione puntano alla stessa libreria?

Credo di essere un po 'confuso su cosa sia effettivamente una libreria. Dove esiste? Non è una libreria collegata al programma attraverso un file di intestazione?

    
posta yoyo_fun 13.09.2017 - 17:36
fonte

2 risposte

8

Normalmente un'intestazione contiene dichiarazioni che comunicano a un compilatore le funzioni (e le classi, ecc.) presenti in una libreria.

La maggior parte dei compilatori C e C ++ include una libreria standard a cui collegheranno per impostazione predefinita. Per collegarsi ad altre librerie, in genere devi dire al compilatore (linker, in realtà, almeno nella maggior parte dei casi) di collegarsi con loro.

Sul perché ci siano così tante intestazioni: soprattutto perché ci sono molte dichiarazioni, molte delle quali sono solo minimamente correlate l'una con l'altra. Dal momento che un'intestazione (normalmente) contiene un codice sorgente, ogni volta che si compila un file che include un'intestazione, è possibile che si stia ricompilando l'interezza di tale intestazione. Questo può rallentare notevolmente la compilazione (e la velocità di compilazione è spesso un problema con C e C ++ comunque).

Le librerie in genere si presentano in due forme: una è una "libreria statica". Questo è fondamentalmente solo un insieme di file oggetto raccolti insieme in un singolo file, spesso con una directory di qualche tipo aggiunta per rendere più facile trovare quali funzioni sono contenute in quali file. In pratica, il linker controlla semplicemente la directory per trovare i file che soddisfano i riferimenti esterni attualmente non risolti nel tuo codice e li collega come se fosse un qualsiasi altro file oggetto.

Il secondo è una libreria dinamica (ad es. DLL su Windows, .so su Linux). Questo è più simile a un eseguibile: un insieme di file oggetto che sono stati pre-collegati in un modulo caricabile. Quando ci si collega a uno, il linker inserisce una sorta di riferimento alla libreria dinamica nel proprio eseguibile. Quando esegui il tuo programma, il caricatore del sistema operativo mappa la libreria dinamica nello spazio degli indirizzi del tuo processo e "aggiusta" i riferimenti alle funzioni nella libreria dinamica, quindi fanno riferimento agli indirizzi corretti nella libreria.

    
risposta data 13.09.2017 - 17:47
fonte
2

Nuovi identificatori

C, nel corso degli anni, ha aggiunto varie nuove funzioni della libreria standard, tipi, definizioni, ecc.

È possibile che il codice precedente sia stato utilizzato prima di alcuni di questi nuovi identificatori.

Un esempio classico è bool,true,false definito nel "nuovo" <stdbool.h> .

Per evitare che una ricompilazione di quel vecchio codice con un nuovo compilatore fallisse, bool,true,false sono definiti in un file di inclusione standard che prima non esisteva. Quindi il vecchio codice non lo avrebbe incluso e non si presenterebbe alcun conflitto.

Di seguito sono riportati inclusi aggiunti dal C89

<assert.h>
<fenv.h>
<inttypes.h>
<iso646.h>
<stdalign.h>
<stdatomic.h>
<stdbool.h>
<stdint.h>
<stdnoreturn.h>
<tgmath.h>
<threads.h>
<uchar.h>
<wchar.h>
<wctype.h>

Segmentazione della libreria

Sebbene la libreria C possa essere una grande entità, storicamente è stata in pezzi, notabile che il math in virgola mobile è stato gestito separatamente a causa delle sue dimensioni e della non applicabilità a molti programmi C senza Matematica FP. Quindi c'è stato un certo allineamento dei file di intestazione selezionati con alcuni blocchi della libreria C standard. Il codice che non include l'intestazione probabilmente non ha bisogno di quel pezzo della libreria.

    
risposta data 19.09.2017 - 22:51
fonte

Leggi altre domande sui tag