Fichiers d'en-tête C
Le fichier d'en-tête est un fichier avec l'extension .h Il contient des déclarations de fonctions C et des définitions de macros et est référencé et partagé dans plusieurs fichiers sources. Il existe deux types de fichiers d'en-tête : les fichiers d'en-tête écrits par le programmeur et les fichiers d'en-tête fournis par le compilateur.
Pour utiliser un fichier d'en-tête dans un programme, vous devez utiliser la directive de prétraitement C #include pour le référencer. Nous avons déjà vu le fichier d'en-tête stdio.h auparavant, qui est le fichier d'en-tête fourni avec le compilateur.
Faire référence à un fichier d'en-tête équivaut à copier le contenu du fichier d'en-tête, mais nous ne copierons pas directement le contenu du fichier d'en-tête dans le fichier source car il est facile de faire des erreurs, surtout lorsque le programme est composé de plusieurs fichiers sources quand.
Une pratique simple dans les programmes C ou C++, il est recommandé d'écrire toutes les constantes, macros, variables globales système et prototypes de fonction dans des fichiers d'en-tête, et de référencer ces fichiers d'en-tête à tout moment si nécessaire.
Syntaxe de référencement des fichiers d'en-tête
Utilisez la directive de prétraitement #include pour référencer les fichiers d'en-tête utilisateur et système. Il a les deux formes suivantes :
#include <file>
Ce formulaire est utilisé pour référencer les fichiers d'en-tête du système. Il recherche dans la liste standard des répertoires système un fichier nommé fichier. Lors de la compilation du code source, vous pouvez ajouter des répertoires à la liste avec l'option -I.
#include "file"
Ce formulaire est utilisé pour référencer les fichiers d'en-tête des utilisateurs. Il recherche dans le répertoire contenant le fichier actuel un fichier nommé fichier. Lors de la compilation du code source, vous pouvez ajouter des répertoires à la liste avec l'option -I.
Opérations de référencement des fichiers d'en-tête La directive
#include demande au préprocesseur C de parcourir le fichier spécifié en entrée. La sortie du préprocesseur inclut la sortie générée, la sortie générée par le fichier référencé et la sortie texte après la directive #include. Par exemple, si vous avez un fichier d'en-tête header.h, comme suit :
char *test (void);
et un programme principal qui utilise le fichier d'en-tête program.c, comme suit :
int x;#include "header.h"int main (void){ puts (test ());}
compiler Le compilateur verra le flux de jetons suivant :
int x;char *test (void);int main (void){ puts (test ());}
Le fichier d'en-tête n'est référencé qu'une seule fois
Si un fichier d'en-tête est référencé deux fois, le compilateur traitera le contenu du fichier d'en-tête deux fois, ce qui entraînera une erreur. Pour éviter cela, la pratique standard consiste à placer l'intégralité du contenu du fichier dans une instruction de compilation conditionnelle, comme suit :
#ifndef HEADER_FILE#define HEADER_FILE the entire header file file#endif
Cette structure est communément appelée wrapper #ifndef. Lorsque le fichier d'en-tête est à nouveau référencé, la condition est fausse car HEADER_FILE est défini. À ce stade, le préprocesseur ignore tout le contenu du fichier et le compilateur l’ignore.
Référence conditionnelle
Parfois, il est nécessaire de sélectionner une référence parmi plusieurs fichiers d'en-tête différents pour le programme. Par exemple, vous devez spécifier des paramètres de configuration à utiliser sur différents systèmes d'exploitation. Vous pouvez y parvenir grâce à 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 s'il existe de nombreux fichiers d'en-tête, cela n'est pas approprié. Le préprocesseur utilise des macros pour définir les noms des fichiers d'en-tête. C'est ce qu'on appelle une référence conditionnelle. Au lieu d'utiliser le nom du fichier d'en-tête comme argument direct de #include, il vous suffit d'utiliser le nom de la macro :
#define SYSTEM_H "system_1.h" ... #include SYSTEM_H
SYSTEM_H sera développé et le préprocesseur recherchera system_1.h, tout comme #include a été écrit à l'origine. SYSTEM_H peut être défini par votre Makefile via l'option -D.