0Pricing
C Academy · Leçon

Gardes d’inclusion

Évitez les inclusions multiples.

Gardes d’inclusion est une leçon C Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C Academy comprend 4 leçons au total.

Le problème des inclusions multiples

Les en-têtes incluent souvent d'autres en-têtes. Il est facile qu'un même en-tête se retrouve inclus deux fois dans un fichier source.

Dans ce cas, chaque déclaration qu'il contient apparaît deux fois. Pour des définitions de types comme struct ou typedef, cela provoque une erreur de compilation : un type ne peut pas être défini plus d'une fois.

Comment cela se produit

Supposons que a.h et b.h incluent tous deux types.h. Un fichier source qui les inclut tous les deux se retrouve avec types.h copié deux fois.

Le préprocesseur copie aveuglément le texte des en-têtes. Les définitions de types.h sont donc dupliquées, ce qui déclenche une erreur de redéfinition.

/* a.h */ #include "types.h"
/* b.h */ #include "types.h"
/* main.c */
#include "a.h"
#include "b.h"   /* types.h now seen twice */

La protection d'inclusion

Une protection d'inclusion est une petite astuce du préprocesseur qui permet d'inclure un en-tête plusieurs fois sans danger.

Elle entoure tout l'en-tête d'une condition afin que son contenu ne soit traité que la première fois. Les inclusions suivantes sont entièrement ignorées.

#ifndef TYPES_H
#define TYPES_H

/* header contents here */

#endif /* TYPES_H */

Fonctionnement de la protection

La première fois que l'en-tête est rencontré, TYPES_H n'est pas défini : #ifndef est donc vrai et le contenu est traité. Le #define définit ensuite la macro.

Lors d'une inclusion ultérieure, TYPES_H existe déjà : #ifndef est donc faux et le préprocesseur passe directement à #endif.

#ifndef TYPES_H   /* true only the first time */
#define TYPES_H   /* remember we've been here */
/* ... body ... */
#endif

Un en-tête entièrement protégé

Voici un en-tête réaliste dont la protection préserve une définition de type.

Même si de nombreux fichiers incluent point.h directement ou indirectement, la structure Point n'est définie qu'une seule fois par unité de traduction.

/* point.h */
#ifndef POINT_H
#define POINT_H

typedef struct {
    int x;
    int y;
} Point;

Point point_add(Point a, Point b);

#endif

Choisir le nom de la macro

La macro de protection doit être unique dans tout votre projet, sinon deux en-têtes pourraient entrer en conflit et se masquer silencieusement.

Une convention courante consiste à dériver le nom du nom de fichier en majuscules : point.h devient POINT_H, et net/socket.h devient NET_SOCKET_H.

#ifndef NET_SOCKET_H
#define NET_SOCKET_H
/* ... */
#endif

Éviter les noms réservés

Les identifiants qui commencent par un trait de soulignement suivi d'une lettre majuscule, ou qui contiennent deux traits de soulignement consécutifs, sont réservés au compilateur et à la bibliothèque standard.

Évitez les protections comme __POINT_H__. Une forme simple avec un suffixe, comme POINT_H, est sûre et claire.

#ifndef _POINT_H_   /* risky: reserved name pattern */
#ifndef POINT_H     /* preferred */

L'alternative #pragma once

La plupart des compilateurs modernes prennent en charge #pragma once, une ligne placée au début d'un en-tête et qui assure le même rôle.

Cette solution est plus courte et évite les conflits de noms, mais elle ne fait pas partie de la norme C. Les protections traditionnelles avec #ifndef fonctionnent partout.

/* point.h */
#pragma once

typedef struct { int x; int y; } Point;

Protections ou pragma

Les protections avec #ifndef sont entièrement portables et conformes à la norme, mais elles nécessitent une macro unique pour chaque en-tête.

#pragma once est compact et sans conflit, mais dépend de la prise en charge par le compilateur. Certains projets utilisent les deux : un pragma ainsi qu'une protection classique pour une sécurité maximale.

#pragma once
#ifndef POINT_H
#define POINT_H
/* ... */
#endif

Les protections sont propres à chaque unité de traduction

Une protection d'inclusion empêche les inclusions multiples dans un même fichier source pendant sa compilation.

Elle n'empêche pas un en-tête d'être traité une fois dans chacun des fichiers .c distincts. C'est normal, car chaque fichier source constitue une unité de traduction distincte.

Prenez-en l'habitude

Ajoutez une protection d'inclusion à chaque en-tête que vous écrivez, dès la première ligne. Cela coûte trois lignes et évite toute une catégorie d'erreurs déroutantes.

Même les en-têtes simples peuvent ensuite être inclus indirectement par d'autres, alors les protéger dès le départ vous évite des problèmes.

/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
#define MAX_USERS 100
#endif

Vérification rapide

Vérifiez votre compréhension des protections d'inclusion.

Récapitulatif

Vous avez appris pourquoi inclure deux fois un en-tête provoque des erreurs de redéfinition et comment une protection d'inclusion les empêche.

Utilisez #ifndef/#define/#endif avec une macro unique, ou #pragma once. Nous allons maintenant voir comment partager des variables entre plusieurs fichiers avec extern.

Questions Fréquemment Posées

La leçon « Gardes d’inclusion » est-elle gratuite ?

Oui — le texte complet de « Gardes d’inclusion » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C Academy, passe à CoddyKit PRO. Le cours C Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Gardes d’inclusion » ?

Évitez les inclusions multiples. Tu pratiques C Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C Academy ?

Aucune expérience préalable n'est requise. C Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Gardes d’inclusion » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C Academy ?

Oui. Chaque leçon C Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Fichiers d’en-tête et source
  2. Gardes d’inclusion
  3. extern et liaison
  4. Compiler plusieurs fichiers
← Retour à C Academy