Chapitre 5 : Les Directives Au Préprocesseur
Maybe your like
Chapitre 5 Les directives au préprocesseur Le pr�processeur est un programme ex�cut� lors de la premi�re phase de la compilation. Il effectue des modifications textuelles sur le fichier source � partir de directives. Les diff�rentes directives au pr�processeur, introduites par le caract�re #, ont pour but :
- l'incorporation de fichiers source (#include),
- la définition de constantes symboliques et de macros (#define),
- la compilation conditionnelle (#if, #ifdef,...).
5.1 La directive #include
Elle permet d'incorporer dans le fichier source le texte figurant dans un autre fichier. Ce dernier peut �tre un fichier en-t�te de la librairie standard (stdio.h, math.h,...) ou n'importe quel autre fichier. La directive #include poss�de deux syntaxes voisines : #include <nom-de-fichier> recherche le fichier mentionn� dans un ou plusieurs r�pertoires syst�mes d�finis par l'impl�mentation (par exemple, /usr/include/) ; #include "nom-de-fichier" recherche le fichier dans le r�pertoire courant (celui o� se trouve le fichier source). On peut sp�cifier d'autres r�pertoires � l'aide de l'option -I du compilateur. La premi�re syntaxe est g�n�ralement utilis�e pour les fichiers en-t�te de la librairie standard, tandis que la seconde est plut�t destin�e aux fichiers cr��s par l'utilisateur.5.2 La directive #define
La directive #define permet de d�finir :- des constantes symboliques,
- des macros avec paramètres.
5.2.1 Définition de constantes symboliques
La directive #define nom reste-de-la-ligne demande au pr�processeur de substituer toute occurence de nom par la cha�ne de caract�res reste-de-la-ligne dans la suite du fichier source. Son utilit� principale est de donner un nom parlant � une constante, qui pourra �tre ais�ment modifi�e. Par exemple : #define NB_LIGNES 10 #define NB_COLONNES 33 #define TAILLE_MATRICE NB_LIGNES * NB_COLONNES Il n'y a toutefois aucune contrainte sur la cha�ne de caract�res reste-de-la-ligne. On peut �crire #define BEGIN { #define END }5.2.2 Définition de macros
Une macro avec param�tres se d�finit de la mani�re suivante : #define nom(liste-de-paramètres) corps-de-la-macro o� liste-de-paramètres est une liste d'identificateurs s�par�s par des virgules. Par exemple, avec la directive #define MAX(a,b) (a > b ? a : b) le processeur remplacera dans la suite du code toutes les occurences du type MAX(x,y) o� x et y sont des symboles quelconques par (x > y ? x : y) Une macro a donc une syntaxe similaire � celle d'une fonction, mais son emploi permet en g�n�ral d'obtenir de meilleures performances en temps d'ex�cution. La distinction entre une d�finition de constante symbolique et celle d'une macro avec param�tres se fait sur le caract�re qui suit imm�diatement le nom de la macro : si ce caract�re est une parenth�se ouvrante, c'est une macro avec param�tres, sinon c'est une constante symbolique. Il ne faut donc jamais mettre d'espace entre le nom de la macro et la parenth�se ouvrante. Ainsi, si l'on �crit par erreur #define CARRE (a) a * a la cha�ne de caract�res CARRE(2) sera remplac�e par (a) a * a (2) Il faut toujours garder � l'esprit que le pr�processeur n'effectue que des remplacements de cha�nes de caract�res. En particulier, il est conseill� de toujours mettre entre parenth�ses le corps de la macro et les param�tres formels qui y sont utilis�s. Par exemple, si l'on �crit sans parenth�ses : #define CARRE(a) a * a le pr�processeur remplacera CARRE(a + b) par a + b * a + b et non par (a + b) * (a + b). De m�me, !CARRE(x) sera remplac� par ! x * x et non par !(x * x). Enfin, il faut �tre attentif aux �ventuels effets de bord que peut entra�ner l'usage de macros. Par exemple, CARRE(x++) aura pour expansion (x++) * (x++). L'op�rateur d'incr�mentation sera donc appliqu� deux fois au lieu d'une.5.3 La compilation conditionnelle
La compilation conditionnelle a pour but d'incorporer ou d'exclure des parties du code source dans le texte qui sera g�n�r� par le pr�processeur. Elle permet d'adapter le programme au mat�riel ou � l'environnement sur lequel il s'ex�cute, ou d'introduire dans le programme des instructions de d�bogage. Les directives de compilation conditionnelle se r�partissent en deux cat�gories, suivant le type de condition invoqu�e :- la valeur d'une expression
- l'existence ou l'inexistence de symboles.
5.3.1 Condition liée à la valeur d'une expression
Sa syntaxe la plus g�n�rale est : #if condition-1 partie-du-programme-1 #elif condition-2 partie-du-programme-2 ... #elif condition-n partie-du-programme-n #else partie-du-programme-¥ #endif Le nombre de #elif est quelconque et le #else est facultatif. Chaque condition-i doit �tre une expression constante. Une seule partie-du-programme sera compil�e : celle qui correspond � la premi�re condition-i non nulle, ou bien la partie-du-programme-¥ si toutes les conditions sont nulles. Par exemple, on peut �crire #define PROCESSEUR ALPHA #if PROCESSEUR == ALPHA taille_long = 64; #elif PROCESSEUR == PC taille_long = 32; #endif5.3.2 Condition liée à l'existence d'un symbole
Sa syntaxe est #ifdef symbole partie-du-programme-1 #else condition-2 partie-du-programme-2 #endif Si symbole est d�fini au moment o� l'on rencontre la directive #ifdef, alors partie-duprogramme-1 sera compil�e et partie-du-programme-2 sera ignor�e. Dans le cas contraire, c'est partie-du-programme-2 qui sera compil�e. La directive #else est �videmment facultative. Da fa�on similaire, on peut tester la non-existence d'un symbole par : #ifndef symbole partie-du-programme-1 #else condition-2 partie-du-programme-2 #endif Ce type de directive est utile pour rajouter des instructions destin�es au d�bogage du programme : #define DEBUG .... #ifdef DEBUG for (i = 0; i < N; i++) printf("%d\n",i); #endif /* DEBUG */ Il suffit alors de supprimer la directive #define DEBUG pour que les instructions li�es au d�bogage ne soient pas compil�es. Cette derni�re directive peut �tre remplac�e par l'option de compilation -Dsymbole, qui permet de d�finir un symbole. On peut remplacer #define DEBUG en compilant le programme par gcc -DDEBUG fichier.cThis document was translated from LATEX by HEVEA.
Tag » Arduino Ifndef Example
-
Arduino Preprocessor Directives Tutorial - Ifdef & Endif - Device Plus
-
Arduino #ifndef Compiler Directive Issues - Programming Questions
-
Purpose Of #ifndef And #define? - Help & Information - Arduboy
-
Arduino IDE #ifdef
-
8.2 Conditional Compilation (#if, #ifdef, #ifndef, #else, #elif, #endif ...
-
#ifdef - #ifndef - #elseif - #elif - #else - #endif
-
Confusing Nesting Of Numerous #ifndef Statements (with No Values ...
-
#ifndef - YouTube
-
Preprocessor Bug Ignores #ifndef - Breaks Blink Example · Issue #933
-
What Are #ifndef And #define Used For In C++?
-
Problems With Library, #include And #ifdef - PlatformIO Community
-
Compilation Conditionnelle
-
Conditional Inclusion
-
#ifndef - C And C++ Syntax Reference