C Fichier d'en-tête

Un fichier d'en-tête est un fichier dont l'extension est.hLe fichier contient des déclarations de fonctions C et des définitions de macros, et il est référencé et partagé par plusieurs fichiers source. Il existe deux types de fichiers d'en-tête : les fichiers d'en-tête écrits par les programmeurs et les fichiers d'en-tête fournis avec le compilateur.

Pour utiliser un fichier d'en-tête dans un programme, vous devez utiliser la directive de préprocesseur C.#includepour le référencer. Nous avons déjà vu ci-dessus.stdio.hFichier d'en-tête, c'est un fichier d'en-tête fourni avec le compilateur.

Référencer un fichier d'en-tête équivaut à copier le contenu du fichier d'en-tête, mais nous ne copions pas directement le contenu du fichier d'en-tête dans le fichier source, car cela est source d'erreurs, en particulier lorsque le programme est constitué de plusieurs fichiers source.

Une pratique simple dans les programmes C ou C++ consiste à écrire toutes les constantes, macros, variables globales système et prototypes de fonctions dans des fichiers d'en-tête, puis à référencer ces fichiers d'en-tête chaque fois que nécessaire.

Syntaxe de référencement des fichiers d'en-tête

Utilisez les directives de préprocesseur#includeIl peut référencer les fichiers d'en-tête utilisateur et système. Il se présente sous les deux formes suivantes :

#include <file>

Cette forme est utilisée pour référencer les fichiers d'en-tête système. Elle recherche un fichier nommé file dans la liste standard des répertoires système. Lors de la compilation du code source, vous pouvez ajouter des répertoires en tête de cette liste à l'aide de l'option -I.

#include "file"

Cette forme est utilisée pour référencer les fichiers d'en-tête utilisateur. Elle recherche un fichier nommé file dans le répertoire contenant le fichier actuel. Lors de la compilation du code source, vous pouvez ajouter des répertoires en tête de cette liste à l'aide de l'option -I.

Le fonctionnement du référencement des fichiers d'en-tête

#includeLa directive demande au préprocesseur C d'analyser le fichier spécifié comme entrée. La sortie du préprocesseur contient la sortie déjà générée, la sortie générée par le fichier référencé, et#includele texte produit après la directive. 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êteprogram.c, comme suit :

int x;
#include "header.h"

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

Le compilateur verra le code suivant :

int x;
char *test (void);

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

Référencer un fichier d'en-tête une seule fois

Si un fichier d'en-tête est référencé deux fois, le compilateur traitera deux fois le contenu du fichier d'en-tête, ce qui produira des erreurs. Pour éviter cela, la pratique standard consiste à placer tout le contenu du fichier dans des instructions de compilation conditionnelle, comme suit :

#ifndef HEADER_FILE
#define HEADER_FILE

the entire header file file

#endif

Cette structure est communément appelée un wrapper#ifndefLorsque le fichier d'en-tête est référencé à nouveau, la condition est fausse car HEADER_FILE est déjà défini. À ce stade, le préprocesseur ignore tout le contenu du fichier, et le compilateur l'ignore.

Inclusion conditionnelle

Parfois, il est nécessaire de choisir un fichier d'en-tête parmi plusieurs fichiers d'en-tête différents à référencer dans le programme. Par exemple, vous devez spécifier des paramètres de configuration utilisés sur différents systèmes d'exploitation. Vous pouvez y parvenir 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 lorsqu'il y a beaucoup de fichiers d'en-tête, procéder ainsi est très inapproprié. Le préprocesseur utilise des macros pour définir le nom du fichier d'en-tête. C'est ce qu'on appellel'inclusion conditionnelleIl n'utilise pas le nom du fichier d'en-tête comme#includedirect. Vous n'avez qu'à substituer le nom de la macro :

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

SYSTEM_H sera développé, et le préprocesseur cherchera system_1.h, exactement comme#includeécrit à l'origine. SYSTEM_H peut être défini par votre Makefile via l'option -D.


Fichiers d'en-tête de la bibliothèque standard

Les fichiers d'en-tête de la bibliothèque standard C sont un ensemble de fichiers d'en-tête définis par les normes ANSI C (également appelée C89/C90) et ISO C (C99 et C11). Ces fichiers d'en-tête fournissent un grand nombre de fonctions, macros et définitions de types pour des tâches de programmation courantes telles que les entrées/sorties, les opérations sur les chaînes, les calculs mathématiques, la gestion de la mémoire, etc.

Voici quelques fichiers d'en-tête courants de la bibliothèque standard C et une brève introduction à leurs fonctions :

Fichier d'en-tête Présentation des fonctions
<stdio.h> bibliothèque d'entrées/sorties standard, contenantprintf、scanfet d'autres fonctions
<stdlib.h> Fonctions de la bibliothèque standard, incluant des fonctions telles que l'allocation mémoire et le contrôle du programme.
<string.h> fonctions de manipulation de chaînes, telles questrlen、strcpywait
<math.h> Bibliothèques de fonctions mathématiques, telles quesin、cos、sqrtwait
<time.h> fonctions de date et d'heure, telles quetime、strftimewait
<ctype.h> fonctions de traitement des caractères, telles queisalpha、isdigitwait
<limits.h> définit les valeurs limites pour divers types, commeINT_MAXwait
<float.h> définit les valeurs limites pour les types à virgule flottante, telles queFLT_MAXwait
<assert.h> Macro d'assertionassert, pour les vérifications de débogage
<errno.h> Définit des variables de code d'erreurerrnoet les macros associées
<stddef.h> définit des types et des macros courants, tels quesize_t、NULLwait
<signal.h> fonctions et macros pour la gestion des signaux, telles quesignalwait
<setjmp.h> macros et fonctions qui fournissent une fonctionnalité de saut non local
<locale.h> Fonctions et macros liées aux paramètres régionaux, telles quesetlocalewait
autres extensions