Bases de la programmation en C

#ifndef SENSOR_H
#define SENSOR_H
typedef struct { int id; int value; } Sensor;
int sensor_read(Sensor *s);
#endif

Le fichier d'en-tête sensor.h est écrit comme ci-dessus. Quel est le rôle des trois lignes #ifndef, #define et #endif ?

  1. AEnregistrer dans un fichier le résultat de la compilation de l'en-tête, pour accélérer la compilation des autres fichiers source qui utilisent le même en-tête
  2. BRéserver l'usage de cet en-tête aux seuls fichiers source qui définissent SENSOR_H
  3. CN'intégrer le contenu qu'une seule fois même si le même en-tête est inclus plusieurs fois dans un fichier source, et éviter ainsi les erreurs de double définition
Afficher la réponse et l'explication

Réponse : C. N'intégrer le contenu qu'une seule fois même si le même en-tête est inclus plusieurs fois dans un fichier source, et éviter ainsi les erreurs de double définition

Si a.h et b.h incluent tous deux sensor.h et qu'un fichier source inclut a.h et b.h, le contenu de sensor.h est intégré deux fois. SENSOR_H est défini la première fois : la seconde fois, la condition #ifndef SENSOR_H est fausse et tout ce qui précède #endif est sauté. Sans ce mécanisme, la struct Sensor serait définie deux fois, ce qui provoquerait une erreur de compilation. Cette construction s'appelle une garde d'inclusion (include guard), et avec de nombreux compilateurs, #pragma once peut servir au même but.

S'entraîner sur ce thème Retour au thème

Autres questions sur Bases de la programmation en C

  1. Quelle est la sortie obtenue lorsque le code ci-dessus est écrit dans la fonction main et exécuté ?
  2. Un registre de sortie de microcontrôleur est déclaré et utilisé comme ci-dessus. Quelle description de cette déclaration est correcte ?
  3. Quelle description du comportement indéfini, au sens de la norme du langage C, est correcte ?
  4. int et unsigned int font 32 bits. Laquelle des opérations suivantes est un comportement indéfini selon la norme du langage C ?
  5. Lorsque la fonction ci-dessus est compilée avec gcc en activant l'optimisation, le test if (p == NULL) peut être supprimé. Quelle en est la raison ?