Algorithmique et Langage C - ` `%%%`#`&12 ` ~~~...

19
Algorithmique et Langage C Algorithmique et Langage C www.polytech.unice.fr/vg/fr/enseignement/xidian Granet Vincent - [email protected] Xi’an - Octobre 2015 - Avril 2016

Transcript of Algorithmique et Langage C - ` `%%%`#`&12 ` ~~~...

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

119/207

Algorithmique et Langage CPré-processeur C

Le pré-processeur C

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

135/207

Algorithmique et Langage CPré-processeur C

Compilation Conditionnelle (fin)

pour éviter des inclusions multiples

#i f n d e f INCL_H#de f i n e INCL_H

/* Contenu du fichier incl.h */#end i f