Langage C avancé Utilisation du préprocesseur cpp

Documents pareils
1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Introduction au langage C

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Le prototype de la fonction main()

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Le langage C. Séance n 4

Algorithmique et Programmation, IMA

Cours Programmation Système

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Cours Langage C/C++ Programmation modulaire

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Java Licence Professionnelle CISII,

Quelques éléments de compilation en C et makefiles

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Les structures. Chapitre 3

Programmation impérative


DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Cours d initiation à la programmation en C++ Johann Cuenin

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Programmation système I Les entrées/sorties

Systeme d'exploitation

Programmation système de commandes en C

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Programmation système en C/C++

3IS - Système d'exploitation linux - Programmation système

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Introduction à la Programmation Parallèle: MPI

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Conventions d écriture et outils de mise au point

Architecture des ordinateurs

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Initiation à la programmation en Python

Notions fondamentales du langage C# Version 1.0

Bases de programmation. Cours 5. Structurer les données

Le système de gestion des fichiers, les entrées/sorties.

Les processus légers : threads. Système L3, /31

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Construction de logiciel et packaging

Mon premier rpm. 7 juin Avant de commencer RPM URPMI RPMBUILD... 2

Programmation en langage C

Testez votre installation. Créer un répertoire vide

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Outils pour la pratique

INITIATION A LA PROGRAMMATION

Programmation C++ (débutant)/instructions for, while et do...while

Les débordements de tampons et les vulnérabilités de chaîne de format 1

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

I. Introduction aux fonctions : les fonctions standards

TP 1. Prise en main du langage Python

Rappels Entrées -Sorties

Les chaînes de caractères

Compression de Données - Algorithme de Huffman Document de Conception

OS Réseaux et Programmation Système - C5

Programmer en JAVA. par Tama

Programmation en C/C++

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

ACTIVITÉ DE PROGRAMMATION

Structure d un programme

Chap III : Les tableaux

INF 104 (SELC) Introduction au langage C

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

Langage Éric Guérin 5 octobre 2010

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

REPUBLIQUE ALGERIENNE DEMOCRATIQUE ET POPULAIRE UNIVERSITE M HAMED BOGARA DE BOUMERDES

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Les fichiers. Chapitre 4

Cours de C/C++ par la pratique. Hugues Talbot

Java Licence Professionnelle CISII,

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

Derrière toi Une machine virtuelle!

TD3: tableaux avancées, première classe et chaînes

Claude Delannoy. 3 e édition C++

Notes du cours 4M056 Programmation en C et C++ Vincent Lemaire et Damien Simon

SUPPORT DE COURS. Langage C

Cours Informatique Master STEP

as Architecture des Systèmes d Information

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Introduction à l algorithmique et à la programmation M1102 CM n 3

STAGE IREM 0- Premiers pas en Python

Utilisation d objets : String et ArrayList

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

Cryptographie RSA. Introduction Opérations Attaques. Cryptographie RSA NGUYEN Tuong Lan - LIU Yi 1

INFO-F-404 : Techniques avancées de systèmes d exploitation

Département Automatisation et Informatisation Année Programmation en C++ Institut des Sciences et Techniques de l Ingénieur d Angers

Cours d Algorithmique et de Langage C v 3.0

Introduction à l héritage en C++

Programmation Classique en langage C

Transcription:

Langage C avancé Utilisation du préprocesseur cpp Samuel KOKH Maison de la Simulation - CEA Saclay samuel.kokh@cea.fr MACS 1 (2013-2014) Institut Galilée S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 1 / 23

Le préprocesseur cpp Qu est-ce que le préprocesseur (preprocessor) Le préprocesseur est un programme qui effectue des modifications syntaxiques dans les fichiers sources de manière automatique. $ which cpp / usr / bin / cpp shell S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 2 / 23

Appel du préprocesseur Appels encapsulés dans les appels à gcc (usage courant) $ gcc -Wall -c A.c shell Lance le préprocesseur sur le fichier A.c et compile le résultat. Appel «à la main» (éventuellement utile pour du débuggage) $ cpp A.c Affichage du résulat sur la sortie standard $ cpp A.c > newa.c Envoie du résultat dans un fichier via un pipe S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 3 / 23

Comment expliquer au préprocesseur ce qu il doit faire? Utilisation de «directives» préprocesseurs. Les directives commencent toujours par le caractère #. S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 4 / 23

Remplacement de texte (macros) # define LINESIZE 1024 Code source char buffer [ LINESIZE ]; snprintf ( buffer, LINESIZE, " hello \n"); Code source apres traitement par cpp char buffer [ 1024]; snprintf ( buffer, 1024, " hello \n"); S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 5 / 23

Exemple d utilisation des macros # define TRUE ( 1==1) # define FALSE ( 0==1) if ( test == TRUE ){ DoSomething } Code source apres traitement par cpp /* extrait du fichier math. h */ # define M_PI 3.14159265358979323846 /* pi */ /* extrait du fichier stddef. h */ # define NULL (( void *) 0) S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 6 / 23

Définition de macros avec paramètres # define SQUARE (a) ((a)*( a)) # define MULTIPLY (a,b) ((a)*( b)) double d = SQUARE ( 3. 24); double dd = MULTIPLY (3.2,4.5); double d = ((3.24)*(3.24)); double dd = ((3.2)*(4.5)); Code source apres traitement par cpp S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 7 / 23

Définition de macros avec paramètres : écueils Les macros avec paramètres peuvent être la source de très gros problèmes. Il convient par exemple de faire très attention à l usage des parenthèses! # define SQUARE (a) a*a # define MULTIPLY (a,b) a*b double d = SQUARE (3 + 2); double dd = MULTIPLY (3 + 1,2); double d = 3 + 2*3 + 2; double dd = 3 + 1* 2; Code source apres traitement par cpp S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 8 / 23

Définition de macros avec paramètres : écueils # define min (X, Y) ((X) < (Y)? (X) : (Y)) # define SQUARE (a )*( a) int i =3; int j =0; double x = 3; double m = min (3.145, x); double M = min (i,j ++); double d = 1./ SQUARE ( 2); Code source apres traitement par cpp double x = 3; double m = ((3.145) < (x)? (3.145) : (x )); double M = ((i) < (j ++)? (i) : (j ++)); /* j est incremente deux fois! */ double d = 1./(2)*(2); /* d = 1! */ S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 9 / 23

Inclusion de fichiers La directive #include permet d inclure dans le fichier à compiler le contenu d un autre fichier (à la manière d un copier-coller). # include < stdio.h> # include " myheader.h" #include<> cherche les fichiers parmi une liste de directories «système» comme /usr/local/include ou /usr/include. #include"" cherche les fichiers dans le directory local ou une liste de directories passés en argument à gcc via l option de compilation -I, par ex. : $ gcc -I dir1 -I dir2 -I../dir3 -Wall -c foo.c S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 10 / 23

Compilation conditionnelle : #ifdef/#else/#endif # ifdef XXX... // option 1 # else... // option 2 # endif Si XXX est défini par une directive #define alors on tient compte des lignes option 1 sinon c est l option 2. # ifdef ENGLISH char msg [] = " hello "; # else char msg [] = " bonjour "; # endif S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 11 / 23

Compilation conditionnelle : #ifndef/#else/#endif # ifndef XXX... // option 1 # else... // option 2 # endif Si XXX est n est pas défini par une directive #define alors on tient compte des lignes option 1 sinon c est l option 2. # ifndef _WIN32 // _WIN32 is defined by all Windows 32 compilers, but not by others. # include < unistd.h> # else # include < windows.h> # endif S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 12 / 23

Compilation conditionnelle : les «include guards» Tous les fichiers *.h doivent impérativement être écrits comme suit. # ifndef MY_ HEADER_ H # define MY_ HEADER_ H fichier myheader.h... contenu du fichier myheader. h # endif Ceci permet d éviter les inclusions récursives de fichier *.h. S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 13 / 23

Compilation conditionnelle : #if//#elif#else/#endif #if test1... // option 1 # elif test2... // option 2 # else... // option 3 # endif test1 et test2 sont des expressions entières évaluées par le préproceseur. Les valeurs non-nulles sont équivalentes à «vrai» et déclenchent la compilation. # if DEBUG_LEVEL >= 2 printf ("a lot of debug info \n"); # elif DEBUG_LEVEL == 1 printf ("a bit of debug info \n"); # endif S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 14 / 23

Compilation conditionnelle : commenter un bloc de code fichier myheader.h #if 0 printf (" ceci est un bloc de lignes "); printf ("de code "); printf (" que je souhaite commenter "); # endif S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 15 / 23

Macros qui génèrent des instructions Il convient d être prudent avec les macros qui génèrent des instructions. # define ERROR ( msg ) fprintf ( stderr, msg ); exit ( EXIT_FAILURE ) if( NULL == ptr ) ERROR (" problem with the pointer "); est transformé en if( NULL == ptr ) fprintf ( stderr, msg ); exit ( EXIT_FAILURE ); S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 16 / 23

Macros qui génèrent des instructions Cette version ne convient pas non plus. # define ERROR ( msg ) { fprintf ( stderr, msg ); exit ( EXIT_FAILURE )}; if( NULL == ptr ) ERROR (" problem with the pointer "); est transformé en if( NULL == ptr ){ fprintf ( stderr, msg ); exit ( EXIT_FAILURE ); }; et on ne peut pas ajouter de else if( NULL == ptr ) ERROR (" problem with the pointer "); else { /* something else */ } S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 17 / 23

Macros qui génèrent des instructions La solution consiste à utiliser un do {} while(0) # define ERROR ( msg ) do{ fprintf ( stderr, msg ); exit ( EXIT_FAILURE )} while (0) if( NULL == ptr ) ERROR (" problem with the pointer "); est transformé en if( NULL == ptr ) do { fprintf ( stderr, msg ); exit ( EXIT_FAILURE ); } while (0); S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 18 / 23

Scope de définition d une macro Le préprocesseur remplace une expression par la valeur de sa macro à partir de l endroit où elle est définit dans le fichier. La directive #undef permet d annuler la définition d une macro. bob = X; # define X 125 alice = X; peter = X; # undef X mary = X; est remplacé par bob = X; alice = 125; peter = 125; mary = X; S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 19 / 23

On peut écrire les macros sur plusieurs lignes grâce au backslash. # define MSG " hello \ world \ " # define ERROR ( msg ) do {\ fprintf ( stderr, msg );\ exit ( EXIT_FAILURE )}\ while (0) printf ( MSG ); if( NULL == ptr ) ERROR (" wrong pointer "); S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 20 / 23

Quelques Macros prédéfinies DATE : est remplacé par la date de compilation FILE : est remplacé par le nom du fichier source en train d être compilé LINE : est remplacé par le numéro de ligne dans le fichier source en train d être compilé TIME : est remplacé par l heure de compilation S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 21 / 23

Quelques Macros utiles pour le débuggage # define DISPLAYLINE printf ("DB %s : %d\n", FILE, LINE ) # define ShowDouble ( var ) printf ("DB %s = %g\n",#var, var ) # define ShowInt ( var ) printf ("DB %s = %d\n",#var, var ) # define ShowChar ( var ) printf ("DB %s = %c\n",#var, var ) # define ShowString ( var ) printf ("DB %s = %s\n",#var, var ) S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 22 / 23

Définition de macro à l appel de gcc Il est possible de définir ou de spécifier la valeur d une macro à la volée, à l appel de gcc, sans modifier les fichiers sources. Définition de la macro mymacro $ gcc - DmyMacro -Wall -c foo.c Définition de la valeur de la macro mymacro $ gcc - DmyMacro =2 -Wall -c foo.c S. KOKH (MdlS) Langage C avancé ISPG/MACS 1 2013-2014 23 / 23