C - Fichiers d'en-tête

Un fichier d'en-tête est un fichier avec l'extension .hqui contient des déclarations de fonction C et des définitions de macro à partager entre plusieurs fichiers source. Il existe deux types de fichiers d'en-tête: les fichiers que le programmeur écrit et les fichiers fournis avec votre compilateur.

Vous demandez d'utiliser un fichier d'en-tête dans votre programme en l'incluant avec la directive de prétraitement C #include, comme vous avez vu l'inclusion de stdio.h en-tête, fourni avec votre compilateur.

Inclure un fichier d'en-tête équivaut à copier le contenu du fichier d'en-tête mais nous ne le faisons pas car il sera sujet aux erreurs et ce n'est pas une bonne idée de copier le contenu d'un fichier d'en-tête dans les fichiers source, surtout si nous avoir plusieurs fichiers source dans un programme.

Une pratique simple dans les programmes C ou C ++ est que nous conservons toutes les constantes, macros, variables globales du système et prototypes de fonctions dans les fichiers d'en-tête et incluons ce fichier d'en-tête partout où cela est nécessaire.

Inclure la syntaxe

Les fichiers d'en-tête utilisateur et système sont inclus à l'aide de la directive de prétraitement #include. Il a les deux formes suivantes -

#include <file>

Ce formulaire est utilisé pour les fichiers d'en-tête système. Il recherche un fichier nommé «fichier» dans une liste standard de répertoires système. Vous pouvez ajouter des répertoires à cette liste avec l'option -I lors de la compilation de votre code source.

#include "file"

Ce formulaire est utilisé pour les fichiers d'en-tête de votre propre programme. Il recherche un fichier nommé «fichier» dans le répertoire contenant le fichier courant. Vous pouvez ajouter des répertoires à cette liste avec l'option -I lors de la compilation de votre code source.

Inclure l'opération

le #includeLa directive fonctionne en demandant au préprocesseur C d'analyser le fichier spécifié comme entrée avant de continuer avec le reste du fichier source actuel. La sortie du préprocesseur contient la sortie déjà générée, suivie de la sortie résultant du fichier inclus, suivie de la sortie provenant du texte après le#includedirectif. Par exemple, si vous avez un fichier d'en-tête header.h comme suit -

char *test (void);

et un programme principal appelé program.c qui utilise le fichier d'en-tête, comme ceci -

int x;
#include "header.h"

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

le compilateur verra le même flux de jetons qu'il le ferait si program.c lisait.

int x;
char *test (void);

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

En-têtes uniques

Si un fichier d'en-tête est inclus deux fois, le compilateur traitera son contenu deux fois et cela entraînera une erreur. La manière standard d'éviter cela est de placer tout le contenu réel du fichier dans un conditionnel, comme celui-ci -

#ifndef HEADER_FILE
#define HEADER_FILE

the entire header file file

#endif

Cette construction est communément appelée wrapper #ifndef. Lorsque l'en-tête est à nouveau inclus, le conditionnel sera faux, car HEADER_FILE est défini. Le préprocesseur ignorera tout le contenu du fichier et le compilateur ne le verra pas deux fois.

Comprend calculé

Parfois, il est nécessaire de sélectionner l'un des différents fichiers d'en-tête à inclure dans votre programme. Par exemple, ils peuvent spécifier des paramètres de configuration à utiliser sur différents types de systèmes d'exploitation. Vous pouvez le faire avec une série de conditions comme suit -

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

Mais à mesure qu'il grandit, cela devient fastidieux, au lieu de cela, le préprocesseur offre la possibilité d'utiliser une macro pour le nom de l'en-tête. C'est ce qu'on appelle uncomputed include. Au lieu d'écrire un nom d'en-tête comme argument direct de#include, vous mettez simplement un nom de macro ici -

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

SYSTEM_H sera développé et le préprocesseur recherchera system_1.h comme si le #includeavait été écrit de cette façon à l'origine. SYSTEM_H peut être défini par votre Makefile avec une option -D.