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
Le pré-processeur C
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
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
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
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
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
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
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
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
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
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
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
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"
Compilation Conditionnelle
Intérêt
ne pas compiler le code non utilisé paramétrage du code
son
133/227
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
oùif-headerest :
#if static-expr ou
#ifdef ident
vrai si ident est défini
ou
#ifndef ident vrai si identnondéfini
son
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
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