• Aucun résultat trouvé

Le pré-processeur C

N/A
N/A
Protected

Academic year: 2022

Partager "Le pré-processeur C"

Copied!
18
0
0

Texte intégral

(1)

Algorithmique et Langage C

www.polytech.unice.fr/žvg/index-xidian.html

Granet Vincent - Vincent.Granet@univ-cotedazur.fr

Xi’an - Octobre 2019 - Avril 2020

1/227

(2)

Le pré-processeur C

(3)

Introduction

Définition

Un pré-processeur assure destransformationsdu code source d’un pro- grammeavantles phases de traitement du compilateur proprement dit.

CPP

Le pré-processeur C, appeléCPP, fait des transformationstextuelles par application et traitement dedirectives. L’optionEpermet d’arrêter le compilateur après l’exécution du pré-processeur.

son

121/227

(4)

Schéma de traduction

cc CPP gcc

prog.c

prog prog.i

Après l’exécution de CPP le fichierprog.i ne contient que des instructions C.

son

(5)

Directive

Syntaxe

Une directive est introduite par un dièse :

#commande[paramètres]

Principales fonctions

définitions de macros et remplacement (#define) inclusion de fichiers (#include)

compilation conditionnelle (#if,#ifdef,#ifndef) son

123/227

(6)

Définition de macros

Macros simples

pour définir desconstantes

#define IDENT suite de caractères

#define FALSE 0

#define EOF (−1)

#define PI 3.141592653

#define SIZE 1024

#define SIZE2 (2 SIZE)

#define begin {

#define end ;}

#define then

#define procedure v o i d son

(7)

Remplacement de macros

le remplacement estuniquement textuel

Avant remplacement

i n t buf[SIZE], big_buf[SIZE2];

procedure foo(v o i d) begin

i f (x < SIZE) then begin

x++; z++

end end

Après remplacement

i n t buf[1024],

big_buf[(2 1024)];

v o i d foo(v o i d) {

i f (x < 1024) { x++; z++

;}

;}

son

125/227

(8)

Macros prédéfinies

Elles sont définies dans l’environnement de programmation C Exemples

__DATE__date de compilation __TIME__heure de compilation __FILE__nom du fichier source

__TIMESTAMP__date et heure dernière modification du fichier source

__LINE__ligne courant dans le fichier source __STDC__doit être définie en C ANSI/ISO C99 __func__le nom de la fonction courante Ces macrosne peuvent pasêtre indéfinies (#undef) son

(9)

Définition de macros simples en option à gcc

Option D

Cette option permet la définition d’une macro simple sans avoir à modifier le(s) fichier(s) source(s) du programme

% gcc -Wall -DMAXSIZE=100 -DDEBUG prog.c son

127/227

(10)

Macros avec paramètres

Les macros peuvent posséder des paramètres, pour définir des pseudo-fonctions« inline ».

Toutefoisattention, cene sont pasde vraies fonctions.

Syntaxe

#defineidentifier(x1,x2, ...,xn)suite-de-caractères son

(11)

Macros avec paramètres (suite)

#d e f i n e min(a,b) ((a)<(b) ? (a):(b))

#d e f i n e max(a,b) ((a)>(b) ? (a):(b))

#d e f i n e getchar() getc(stdin)

#d e f i n e putchar(c) putc(c, stdout)

Avant remplacement

c = getchar();

m = min(m, c);

Après remplacement

c = getc(stdin);

m = ((m)<(c) ? (m):(c));

son

129/227

(12)

Macros avec paramètres (suite)

Attention au problème de priorité des opérateurs Solution: utilisation des parenthèses

#define square(x) x x

Avant remplacement x = square(y+1);

Après remplacement

x = y+1 y+1;

/ i.e. x = y+(1 y)+1 !! /

#define square(x) ((x) (x)) son

(13)

Macros avec paramètres (fin)

Utilisation d’une macro avec paramètresn’est pas un appelde fonction. Comme le montre l’exemple suivant, les paramètres ne sont pas évalués.

Avant remplacement m = max(x++,y++);

Après remplacement

m = ((x++)>(y++)?(x++):(y++));

/ x ou y est incrémenté deux fois /

son

131/227

(14)

Inclusion de fichiers

La directive d’inclusion,#includepermet d’inclusion du contenu d’un fichier en lieu et place de la directive. Le fichier à inclure peut lui-même contenir des directives d’inclusion.

2 Notations

#include "filename", pour rechercher à partir du répertoire courant, ou en cas d’échec, dans les répertoires standard.

#include <filename>, pour rechercher uniquement dans les répertoires standard.

#include "mine.h"

#include "../../stack.h"

#include "/home/soft/stack.h"

#include <stdio.h>

#include <sys/stat.h>

#include "stdio.h"

(15)

Compilation Conditionnelle

Intérêt

ne pas compiler le code non utilisé paramétrage du code

son

133/227

(16)

Compilation Conditionnelle (suite)

#if-header then-code

#endif

#if-header then-code

#else

else-code

#endif

#if-header then-code

#elif static-expr elif-code

#endif

if-headerest :

#if static-expr ou

#ifdef ident

vrai si ident est défini

ou

#ifndef ident vrai si identnondéfini

son

(17)

Compilation Conditionnelle (suite)

#i f n d e f MAXSIZE

#d e f i n e MAXSIZE 512

#e n d i f

s t r u c t exec { / a.out header /

#i f __u370

i n t a_magic; / magic number /

i n t a_stamp; / The version of a.out /

#e l s e

s h o r t a_magic; / magic number /

#e n d i f ...

}

#i f MAXSIZE > 1024

#e r r o r MAXSIZE must be less or equal than 1024

#e l s e

i n t buf[MAXSIZE];

#e n d i f

son

135/227

(18)

Compilation Conditionnelle (fin)

pour éviter des inclusions multiples

#i f n d e f INCL_H

#d e f i n e INCL_H

/ Contenu du fichier incl.h /

#e n d i f

ou plus simplement :

#pragma once

/ Contenu du fichier incl.h /

son

Références

Documents relatifs

Le report à nouveau créditeur représente la part du bénéfice N dont l’affectation est différée

Chapitre Géométrie - 01 Vecteurs, droites et plans de l’espace Cours.. Deux droites de l’espace peuvent

Il est question à travers cette étude de faire un diaporama de la gouvernance de la forêt Boucher dans la ville de Gatineau, en s’intéressant particulièrement

Résultats : vitesse au dernier palier complété Tests Triangulaires.. ➢ Il existe deux protocoles

Au contraire, il nous paraît davantage pertinent de réfléchir globalement aux relations qui existent entre le tutorat, le scénario pédagogique et le contexte global dans

» Pour elle comme pour Léa et Noah, plus question non plus d’aller au collège dans la commune voisine.. Et le retour n’est pas prévu avant le 3 mai,

corderaient à l'une quelconque des six puis- sances suivantes : Angleterre, Belgique, Pays- Bas, Suisse, Autriche et Russie. Pouyer-Quertier pouvait croire alors qu'il avait fait

plus pauvres. Stimuler l’application des technologies dans une optique de réduction des coûts. Accroître les services dans les zones rurales, reculées et peu peuplées. Renforcer