C - File di intestazione

Un file di intestazione è un file con estensione .hche contiene dichiarazioni di funzioni C e definizioni di macro da condividere tra diversi file sorgente. Esistono due tipi di file di intestazione: i file scritti dal programmatore e i file forniti con il compilatore.

Richiedi di utilizzare un file di intestazione nel tuo programma includendolo con la direttiva di pre-elaborazione C. #include, come hai visto l'inclusione di stdio.h file di intestazione, che viene fornito con il compilatore.

Includere un file di intestazione equivale a copiare il contenuto del file di intestazione, ma non lo facciamo perché sarà soggetto a errori e non è una buona idea copiare il contenuto di un file di intestazione nei file di origine, soprattutto se avere più file di origine in un programma.

Una pratica semplice nei programmi C o C ++ è che conserviamo tutte le costanti, le macro, le variabili globali a livello di sistema e i prototipi di funzione nei file di intestazione e includiamo quel file di intestazione ovunque sia richiesto.

Includi sintassi

Sia l'utente che i file di intestazione del sistema vengono inclusi utilizzando la direttiva di pre-elaborazione #include. Ha le seguenti due forme:

#include <file>

Questo modulo viene utilizzato per i file di intestazione del sistema. Cerca un file denominato "file" in un elenco standard di directory di sistema. Puoi anteporre le directory a questo elenco con l'opzione -I durante la compilazione del codice sorgente.

#include "file"

Questo modulo viene utilizzato per i file di intestazione del proprio programma. Cerca un file denominato "file" nella directory contenente il file corrente. Puoi anteporre le directory a questo elenco con l'opzione -I durante la compilazione del codice sorgente.

Includi operazione

Il #includeLa direttiva funziona indirizzando il preprocessore C a scansionare il file specificato come input prima di continuare con il resto del file sorgente corrente. L'output del preprocessore contiene l'output già generato, seguito dall'output risultante dal file incluso, seguito dall'output che proviene dal testo dopo il#includedirettiva. Ad esempio, se hai un file di intestazione header.h come segue:

char *test (void);

e un programma principale chiamato program.c che usa il file header, come questo -

int x;
#include "header.h"

int main (void) {
   puts (test ());
}

il compilatore vedrà lo stesso flusso di token che vedrebbe se program.c leggesse.

int x;
char *test (void);

int main (void) {
   puts (test ());
}

Intestazioni una tantum

Se un file di intestazione viene incluso due volte, il compilatore elaborerà il suo contenuto due volte e si verificherà un errore. Il modo standard per evitare ciò è racchiudere l'intero contenuto reale del file in un condizionale, come questo -

#ifndef HEADER_FILE
#define HEADER_FILE

the entire header file file

#endif

Questo costrutto è comunemente noto come wrapper #ifndef. Quando l'intestazione viene inclusa di nuovo, il condizionale sarà falso, perché HEADER_FILE è definito. Il preprocessore salterà l'intero contenuto del file e il compilatore non lo vedrà due volte.

Comprende calcolate

A volte è necessario selezionare uno dei diversi file di intestazione da includere nel programma. Ad esempio, potrebbero specificare parametri di configurazione da utilizzare su diversi tipi di sistemi operativi. Puoi farlo con una serie di condizionali come segue:

#if SYSTEM_1
   # include "system_1.h"
#elif SYSTEM_2
   # include "system_2.h"
#elif SYSTEM_3
   ...
#endif

Ma man mano che cresce, diventa noioso, invece il preprocessore offre la possibilità di utilizzare una macro per il nome dell'intestazione. Questo è chiamato acomputed include. Invece di scrivere un nome di intestazione come argomento diretto di#include, inserisci semplicemente un nome di macro lì -

#define SYSTEM_H "system_1.h"
...
#include SYSTEM_H

SYSTEM_H verrà espanso e il preprocessore cercherà system_1.h come se il file #includeera stato scritto in quel modo originariamente. SYSTEM_H potrebbe essere definito dal tuo Makefile con un'opzione -D.