Le préprocesseur C

Comment utiliser le préprocesseur C

Le préprocesseur est un outil qui nous aide beaucoup lors de la programmation avec C. Il fait partie du C Standard, tout comme le langage, le compilateur et la bibliothèque standard.

Il analyse notre programme et s'assure que le compilateur obtient tout ce dont il a besoin avant de poursuivre le processus.

Que fait-il, en pratique?

Par exemple, il recherche tous les fichiers d'en-tête que vous incluez avec le#includedirectif.

Il examine également chaque constante que vous avez définie à l'aide de#defineet le remplace par sa valeur réelle.

Ce n'est que le début, et j'ai mentionné ces 2 opérations car ce sont les plus courantes. Le préprocesseur peut faire beaucoup plus.

As-tu remarqué#includeet#defineavoir un#au début? C'est commun à toutes les directives de préprocesseur. Si une ligne commence par#, c'est pris en charge par le préprocesseur.

Conditionnels

Une des choses que nous pouvons faire est d'utiliser des conditions pour changer la façon dont notre programme sera compilé, en fonction de la valeur d'une expression.

Par exemple, nous pouvons vérifier si leDEBUGconstante est 0:

#include <stdio.h>

const int DEBUG = 0;

int main(void) { #if DEBUG == 0 printf(“I am NOT debugging\n); #else printf(“I am debugging\n); #endif }

Constantes symboliques

On peut définir unconstante symbolique:

#define VALUE 1
#define PI 3.14
#define NAME "Flavio"

Lorsque nous utilisons NAME ou PI ou VALUE dans notre programme, le préprocesseur remplace son nom par la valeur, avant d'exécuter le programme.

Les constantes symboliques sont très utiles car nous pouvons donner des noms aux valeurs sans créer de variables au moment de la compilation.

Macros

Avec#defineon peut aussi définir unmacro. La différence entre une macro et une constante symbolique est qu'une macro peut accepter un argument et contient généralement du code, tandis qu'une constante symbolique est une valeur:

#define POWER(x) ((x) * (x))

Notez les parenthèses autour des arguments, une bonne pratique pour éviter les problèmes lorsque la macro est remplacée dans le processus de précompilation.

Ensuite, nous pouvons l'utiliser dans notre code comme ceci:

printf("%u\n", POWER(4)); //16

La grande différence avec les fonctions est que les macros ne spécifient pas le type de leurs arguments ou de leurs valeurs de retour, ce qui peut être pratique dans certains cas.

Si défini

On peut vérifier si une constante symbolique ou une macro est définie en utilisant#ifdef:

#include <stdio.h>
#define VALUE 1

int main(void) {
#ifdef VALUE
  printf("Value is defined\n");
#else
  printf("Value is not defined\n");
#endif
}

Nous avons aussi#ifndefpour vérifier le contraire (macro non définie).

Nous pouvons également utiliser#if definedet#if !definedfaire la même tâche.

Il est courant d'envelopper un bloc de code dans un bloc comme celui-ci:

#if 0

#endif

pour l'empêcher temporairement de s'exécuter ou pour utiliser une constante symbolique DEBUG:

#define DEBUG 0

#if DEBUG
  //code only sent to the compiler
  //if DEBUG is not 0
#endif

Constantes symboliques prédéfinies que vous pouvez utiliser

Le préprocesseur définit également un certain nombre de constantes symboliques que vous pouvez utiliser, identifiées par les 2 traits de soulignement avant et après le nom, notamment:

  • __LINE__se traduit par la ligne courante dans le fichier de code source
  • __FILE__se traduit par le nom du fichier
  • __DATE__se traduit par la date de compilation, dans leMmm gg aaaaformat
  • __TIME__se traduit par le temps de compilation, dans lehh:mm:ssformat

Téléchargez mon gratuitManuel C


Plus de tutoriels clang: