Notions de bases en C

Les macros :

Elles permettent de remplacer certaines expressions par du texte dans un programme à l’aide de la directive #define.

Syntaxe :

Cas d’un texte simple :

#define identificateur texte

A partir de l’instant où cette macro est définie, le préprocesseur va substituer toutes les instances « identificateur » qu'il rencontrera par « texte » dans le programme.

Exemple :

#define Fosc 20000000

Toutes les instances Fosc seront remplacées par 20000000.

Le terme « texte » après l’identificateur peut être n’importe quelle expression.

Exemple :

#define Tcycle  (4*(Fosc/4))

Les macros peuvent recevoir des paramètres comme les fonctions. 

Exemple :

#define carre(a)  a*a

Tous les textes de la forme carre(x) seront remplacés par x*x. Ainsi, dans le code programme, pour un symbole z quelconque, carre(z) sera substitué par z*z.

Il est possible de faire intervenir plusieurs paramètres dans une macro en les séparant par une virgule.

Exemple :

#define somme(x,y)  x + y

Ainsi, somme(a,b) deviendra : a + b ; somme(nombre,p) donnera : nombre + p.

Attention, l’utilisation des macros n’est pas aussi triviale qu’on pourrait l’espérer ; même un espace entre la macro et les paramètres peut changer son évaluation par le préprocesseur. Il faudra pour cela prêter une extrême attention lors de leur définition.

Par exemple, la macro :

#define carre(a)  a*a

Peut produire un mauvais résultat dans le cas de figure ci-après :

i = 4 ;

y = carre(i++) ;

Le préprocesseur va générer l'instruction suivante :

y = ((i++)*(i++)).

On peut s'attendre à ce que la variable i soit incrémentée une fois après le produit. Mais elle sera incrémentée deux fois ; à l’issue de l’évaluation de cette instruction, i est égal à 6, et y égal à 20; le résultat produit est incorrect !

Autre exemple :

#define affiche(a)  printf("résultat pour a %d\ : ", a)
  …
affiche(y) ;
affiche(x+2) ;

Le préprocesseur va produire le code suivant pour substituer affiche(y) et affiche(x+2) :

printf("résultat pour a %d\ : ", y) ;
printf("résultat pour a ¨%d\ : ",x+2) ;

Cet exemple montre que pour une macro, la substitution de paramètres ne se fait pas à l’intérieur d’une chaîne de caractères.

Pour finir, avec la directive #define, les macros peuvent simplifier un programme et le rendre ainsi facilement maintenable. Mais une attention particulière doit être portée dans leur utilisation, à cause de la façon dont elles sont substituées dans le code programme.

A suivre des exercices de démonstrations...

Références:

Site internet:

https://www.microchip.com

Les site de microchip propose des versions gratuites de MPLABX selon les familles de composants. MPLABX est un environnement de dévéloppement intégré pour micocrontrôleurs PIC et AVR. Les docuements techniques sur différents compilateurs, et sur les microcontrôleurs, sont disponibles en téléchargements.

Livres:

- Programmer en Langage C - Cours et exercices - Claude Delanoy - Aux éditions EYROLLES.

Ce livre est un manuel d'apprentissage général du langage C.

- Programming Embedded Systems Second Edition with C and GNU Development Tools - Michael Barr & Anthony Massa - Aux éditions O'REILLY.

- The Definitive Guide to GCC - Second Edition - William von Hagen - Aux editions APRESS.

Ce manuel présente le compilateur C open source GCC, ainsi que son utilisation.

JtBB