Algorithmique et Langage C
Algorithmique et Langage Cwww.polytech.unice.fr/~vg/fr/enseignement/xidian
Granet Vincent - [email protected]
Xi’an - Octobre 2015 - Avril 2016
2/207
Algorithmique et Langage CSommaire
Sommaire
1 Sommaire
2 Bibliographie
3 Introduction
4 Actions élémentaires
5 Types élémentaires
6 Expressions
7 Actions Structurées
8 Routines
9 Énoncés Itératifs
10 Les tableaux
11 Chaînes de Caractères
2 Pré-processeur C
13 Structures et Unions
2 Pointeurs
15 Compilation séparée
120/207
Algorithmique et Langage CPré-processeur C
Introduction
DéfinitionUn pré-processeur assure des transformations du code source d’un pro-gramme avant les phases de traitement du compilateur proprement dit.
CPPLe pré-processeur C, appelé CPP, fait des transformations textuellespar application et traitement de directives. L’option E permetd’arrêter le compilateur après l’exécution du pré-processeur.
121/207
Algorithmique et Langage CPré-processeur C
Schéma de traduction
cc
CPP
gcc
prog.c
prog
prog.i
Après l’exécution de CPP le fichier prog.i ne contient que desinstructions C.
122/207
Algorithmique et Langage CPré-processeur C
Directive
SyntaxeUne 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)
123/207
Algorithmique et Langage CPré-processeur C
Définition de macros
Macros simples
pour définir des constantes#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 void
124/207
Algorithmique et Langage CPré-processeur C
Remplacement de macros
le remplacement est uniquement textuel
Avant remplacement
i n t buf[SIZE],big_buf[SIZE2];
procedure foo(void)begin
i f (x < SIZE) thenbeginx++; z++
endend
Après remplacement
i n t buf[1024],big_buf[(2 * 1024)];
void foo(void){
i f (x < 1024) {x++; z++
;};}
125/207
Algorithmique et Langage CPré-processeur C
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 fichiersource__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 macros ne peuvent pas être indéfinies (#undef)
126/207
Algorithmique et Langage CPré-processeur C
Définition de macros simples en option à gcc
Option DCette option permet la définition d’une macro simple sans avoir àmodifier le(s) fichier(s) source(s) du programme
% gcc -ansi -Wall -DMAXSIZE=100 -DDEBUG prog.c
127/207
Algorithmique et Langage CPré-processeur C
Macros avec paramètres
Les macros peuvent posséder des paramètres, pour définir despseudo-fonctions « inline ».
Toutefois attention, ce ne sont pas de vraies fonctions.
Syntaxe#define identifier(x1, x2, ..., xn) suite-de-caractères
128/207
Algorithmique et Langage CPré-processeur C
Macros avec paramètres (suite)
#de f i n e getchar() getc(stdin)#de f i n e putchar(c) putc(c, stdout)#de f i n e min(a,b) ((a)<(b) ? (a):(b))#de f i n e max(a,b) ((a)>(b) ? (a):(b))
Avant remplacement
c = getchar();m = min(m, c);
Après remplacement
c = getc(stdin);m = ((m)<(c) ? (m):(c));
129/207
Algorithmique et Langage CPré-processeur C
Macros avec paramètres (suite)
Attention au problème de priorité des opérateursSolution : 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 !! */
130/207
Algorithmique et Langage CPré-processeur C
Macros avec paramètres (fin)
Utilisation d’une macro avec paramètres n’est pas un appel defonction. Comme le montre l’exemple suivant, les paramètres ne sontpas évalués.
Avant remplacement
m = max(x++,y++);
Après remplacement
m = ((x++)>(y++)?(x++):(y++));/* x ou y est incrémenté deux
fois */
131/207
Algorithmique et Langage CPré-processeur C
Inclusion de fichiersLa directive d’inclusion, #include permet d’inclusion du contenu d’unfichier en lieu et place de la directive. Le fichier à inclure peutlui-même contenir des directives d’inclusion.2 Notations
#include "filename", pour rechercher à partir du répertoirecourant, ou en cas d’échec, dans les répertoires standard.#include <filename>, pour rechercher uniquement dans lesrépertoires standard.
#include "mine.h"#include "../../stack.h"#include "/home/soft/stack.h"#include <stdio.h>#include <sys/stat.h>#include "stdio.h"
132/207
Algorithmique et Langage CPré-processeur C
Compilation Conditionnelle
Intérêt
ne pas compiler le code non utiliséparamétrage du code
133/207
Algorithmique et Langage CPré-processeur C
Compilation Conditionnelle (suite)
#if-headerthen-code
#endif
#if-headerthen-code
#elseelse-code
#endif
#if-headerthen-code
#elif static-exprelif-code
#endif
où if-header est :
#if static-expr
ou
#ifdef ident
vrai si ident est définiou
#ifndef ident
vrai si ident non défini
134/207
Algorithmique et Langage CPré-processeur C
Compilation Conditionnelle (suite)
#i f n d e f MAXSIZE#de f i n e MAXSIZE 512#end i f
s t ru 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 eshort a_magic; /* magic number */
#end i f...}
#i f MAXSIZE > 1024#error MAXSIZE must be less than 1024#e l s e
i n t buf[MAXSIZE];#end i f