Préprocesseur C et macros : Maîtriser #include, #define et la compilation conditionnelle
Préprocesseur C et macros
Explorez la puissance du préprocesseur C : apprenez à inclure des en-têtes, définir des constantes et des fonctions, et contrôler le flux de compilation avec des directives conditionnelles.

Le préprocesseur C s'exécute avant le compilateur, transformant votre code source en étendant les macros, incluant les fichiers d'en-tête et évaluant les instructions conditionnelles. C'est un outil essentiel pour écrire du code flexible et réutilisable.
Toutes les directives du préprocesseur commencent par un symbole #. Par exemple :
#define PI 3.14
Inclusion de fichiers d'en-tête : #include
La directive #include insère le contenu d'un fichier d'en-tête directement dans votre fichier source. Utilisation courante :
#include <stdio.h>
Sans #include <stdio.h>, des fonctions comme printf() et scanf() seraient indéfinies. Vous pouvez aussi créer des en-têtes personnalisés :
#include "my_header.h"
Les en-têtes personnalisés sont utiles pour regrouper des déclarations de fonctions et des constantes liées.
Définition de constantes et d'expressions : #define
Un macro remplace un jeton ou une expression par une valeur avant la compilation. Exemple :
#define c 299792458 /* vitesse de la lumière */
L'utilisation de c n'importe où dans votre programme se développe en 299792458.
Exemple 1 : Définition de PI
#include <stdio.h>
#define PI 3.1415
int main() {
float radius, area;
printf("Entrez le rayon : ");
scanf("%f", &radius);
area = PI * radius * radius;
printf("Aire=%.2f", area);
return 0;
}
Macros de type fonction
Les macros peuvent accepter des arguments, fonctionnant de manière similaire aux fonctions inline :
#define circleArea(r) (3.1415 * (r) * (r))
Pour circleArea(5), le préprocesseur l'étend à (3.1415 * 5 * 5).
Exemple 2 : Utilisation d'une macro de type fonction
#include <stdio.h>
#define PI 3.1415
#define circleArea(r) (PI * (r) * (r))
int main() {
float radius, area;
printf("Entrez le rayon : ");
scanf("%f", &radius);
area = circleArea(radius);
printf("Aire = %.2f", area);
return 0;
}
Compilation conditionnelle
Les directives conditionnelles permettent d'inclure ou d'exclure des blocs de code à la compilation, similaires aux instructions if mais évaluées avant l'exécution.
Cas d'utilisation courants
- Cibler différents systèmes d'exploitation ou matériels.
- Créer des builds de débogage sans surcoût à l'exécution.
- Maintenir des chemins de code hérités pour référence.
Directives clés
#ifdef MACRO /* code quand MACRO est défini */ #endif
#if EXPRESSION /* code quand EXPRESSION est non-nul */ #else /* code quand EXPRESSION est nul */ #endif
#if EXPRESSION /* code */ #elif ANOTHER_EXPRESSION /* code alternatif */ #else /* code de secours */ #endif
#if defined BUFFER_SIZE && BUFFER_SIZE >= 2048 /* tampon assez grand */ #endif
Macros prédéfinies
| Macro | Valeur |
|---|---|
__DATE__ | Chaîne de la date de compilation courante |
__FILE__ | Chaîne du nom de fichier courant |
__LINE__ | Numéro de ligne où le macro apparaît |
__STDC__ | Non-nul si le compilateur suit le standard ANSI C |
__TIME__ | Chaîne de l'heure de compilation courante |
Exemple 3 : Affichage de l'heure de compilation
#include <stdio.h>
int main() {
printf("Heure actuelle : %s", __TIME__);
return 0;
}
Exemple de sortie :
Heure actuelle : 19:54:39
Lectures recommandées
- Contrôle de ligne
- Pragmas
- Sortie du préprocesseur
- Autres directives
Langue C
- Résumé complet des résistances, inductances et condensateurs dans les circuits alternatifs
- Comprendre les mots-clés et identificateurs C# : règles, listes et bonnes pratiques
- Classes et objets C# : Fondations pour une POO robuste
- Maîtriser les classes et méthodes abstraites C# : Guide pratique
- Comprendre les classes et méthodes partielles C#
- Maîtriser les classes et méthodes sealed en C# : Quand les utiliser, exemples clairs et sécurité du code
- Maîtriser les directives de préprocesseur C# : Guide pratique
- Mots-clés et identificateurs en C : Guide pratique
- Constantes et littéraux en C : Types, utilisation et bonnes pratiques