Menu
Coddy logo textTech

Gardes d'inclusion

Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 2 sur 61.

Lorsqu'un fichier d'en-tête est inclus plusieurs fois dans un projet, le compilateur voit les mêmes déclarations de manière répétée, ce qui provoque des erreurs. Cela se produit couramment lorsque plusieurs fichiers incluent le même en-tête, ou lorsque des en-têtes s'incluent les uns les autres. Les gardes d'inclusion (include guards) résolvent ce problème.

Un garde d'inclusion utilise trois directives de préprocesseur pour garantir que le contenu d'un en-tête n'est traité qu'une seule fois :

// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H

int add(int a, int b);

#endif

Voici comment cela fonctionne : #ifndef MATH_UTILS_H vérifie si le symbole MATH_UTILS_H n'a pas encore été défini. Si ce n'est pas le cas, le préprocesseur continue et le définit immédiatement avec #define MATH_UTILS_H. Tout ce qui se trouve entre ce point et #endif est inclus dans la compilation.

La deuxième fois que cet en-tête est inclus, MATH_UTILS_H est déjà défini, donc le bloc entier est ignoré. Le nom de la garde est généralement le nom du fichier en majuscules, avec des tirets bas remplaçant les points et les caractères spéciaux.

Chaque fichier d'en-tête que vous créez devrait avoir des gardes d'inclusion (include guards). C'est une pratique standard qui évite les erreurs de compilation et rend votre code sûr à inclure de n'importe où dans votre projet.

challenge icon

Défi

Facile

Protégeons un fichier d'en-tête contre la double inclusion en ajoutant des gardes d'inclusion (include guards). Vous allez vous appuyer sur l'utilitaire de salutation de la leçon précédente, mais cette fois-ci, assurez-vous que l'en-tête peut être inclus plusieurs fois en toute sécurité.

Vous allez créer deux fichiers :

  • greet.h : Votre fichier d'en-tête contenant la déclaration de la fonction pour greet. Cette fois, enveloppez tout le contenu avec des gardes d'inclusion en utilisant le symbole GREET_H.
  • main.c : Votre fichier principal qui inclut l'en-tête, implémente la fonction greet et l'appelle depuis main().

La fonction greet doit accepter un paramètre const char* pour le nom et afficher :

Hello, Alice!

Votre fichier d'en-tête doit suivre cette structure :

#ifndef GREET_H
#define GREET_H

// function declaration here

#endif

Vous recevrez une entrée : un nom (chaîne de caractères).

Affichez le message de salutation exactement comme indiqué dans le format ci-dessus, en remplaçant Alice par le nom fourni.

Aide-mémoire

Les gardes d'inclusion empêchent les fichiers d'en-tête d'être traités plusieurs fois pendant la compilation, ce qui provoquerait des erreurs.

Une garde d'inclusion utilise trois directives de préprocesseur :

#ifndef HEADER_NAME_H
#define HEADER_NAME_H

// contenu de l'en-tête ici

#endif

#ifndef vérifie si un symbole n'a pas été défini. S'il n'est pas défini, #define le définit et le contenu est traité. Lors des inclusions suivantes, le symbole est déjà défini, donc le bloc entier est ignoré.

Le nom de la garde est généralement le nom du fichier en majuscules, avec des underscores remplaçant les points et les caractères spéciaux.

Chaque fichier d'en-tête devrait avoir des gardes d'inclusion par convention standard.

Essayez vous-même

#include <stdio.h>
#include "greet.h"

// TODO: Implémenter la fonction greet qui affiche "Hello, <name>!"

int main() {
    char name[100];
    scanf("%s", name);
    
    // TODO: Appeler la fonction greet avec le name
    
    return 0;
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Object Oriented Programming