Preprocessore, linker e libreria standard

25
Elementi di Informatica e Programmazione – Università di Brescia 1 Prof. M. Giacomin Preprocessore, linker e libreria standard Università degli Studi di Brescia Prof. Massimiliano Giacomin

Transcript of Preprocessore, linker e libreria standard

Elementi di Informatica e Programmazione – Università di Brescia 1Prof. M. Giacomin

Preprocessore, linkere libreria standard

Università degli Studi di Brescia

Prof. Massimiliano Giacomin

Elementi di Informatica e Programmazione – Università di Brescia 2Prof. M. Giacomin

IL PREPROCESSORE

PreprocessoreProgramma sorgente

Programma eseguibile

Linguaggio C Linguaggio macchina

CompilatoreProgramma

sorgentemodificato

Linguaggio C

Finora abbiamo trascurato il ruolo del preprocessore

• Esegue le direttive del preprocessore, rimuovendole- hanno la forma #direttiva- non sono seguite da punto e virgola

• Rimuove i commenti (in alcuni casi anche spazi inutili)

Pura manipolazione testuale (no compilazione)

Elementi di Informatica e Programmazione – Università di Brescia 3Prof. M. Giacomin

• Definizione di macro semplici- identificatori che vengono trasformati in un testo definito

• Inclusione di file - molto utile nel caso di programmi strutturati su più file

• Compilazione condizionale- parti di programma C che possono essere compilate in modocondizionato (es: in alternativa) sulla base delle macro definite

- non esaminate qui (per gli appassionati: vedi appendice)

PRINCIPALI DIRETTIVE DEL PREPROCESSORE

NB: le direttive possono essere poste ovunque nel file

Elementi di Informatica e Programmazione – Università di Brescia 4Prof. M. Giacomin

#define identificatore testo-di-sostituzione

Definizione di macro semplici

Esempio

#define ITERAZIONI 200 //numero di iterazioni

void main(…){

for(i=1; i<=ITERAZIONI; i++){

}

VantaggiModificabilità + Leggibilità

Elementi di Informatica e Programmazione – Università di Brescia 5Prof. M. Giacomin

• Direttiva #include:

#include <nomefile>#include �nomefile�

• Nella prima forma, il file viene ricercato in una directory predefinita

• Nella seconda, il file viene cercato prima nella directory corrente,

poi nella directory predefinita

Inclusione di file

NB: vediamo un utilizzo comune…

Elementi di Informatica e Programmazione – Università di Brescia 6Prof. M. Giacomin

PROGRAMMI SU PIU’ FILE

• Tipicamente i programmi di grandi dimensioni sono suddivisi in più file sorgente, p.es.

- un file contenente funzioni per calcoli matematici- un file contenente il main che utilizza queste funzioni

• Il compilatore consente la compilazione separata di ciascun file sorgente, ottenendo un modulo oggetto

• I diversi moduli oggetto possono essere “collegati” medianteun programma detto linker

Elementi di Informatica e Programmazione – Università di Brescia 7Prof. M. Giacomin

preprocessore+ compilatore

programma sorgente

Modulooggetto

matematica.c matematica.o

preprocessore+ compilatore

programma sorgente

Modulooggetto

main.c main.o

COMPILAZIONE SEPARATA

• I moduli oggetto contengono codice in linguaggio binario non

direttamente eseguibile (cf. riferimenti esterni) + informazioni

supplementari

Elementi di Informatica e Programmazione – Università di Brescia 8Prof. M. Giacomin

preprocessore+ compilatore

programma sorgente

Modulooggetto

main.c main.o

• Affinchè possa essere chiamata una funzione, è necessario che nel

file sia incluso il suo prototipo (poi la funzione può essere definita

anche in un altro file!)

- in questo modo il C può verificare che la funzione esiste,

verificare la corrispondenza tra parametri attuali e formali,

effettuare i controlli di tipo su parametri e risultato

Compilazione separata e chiamata di funzioni

Elementi di Informatica e Programmazione – Università di Brescia 9Prof. M. Giacomin

modulo oggetto

linkermodulo oggetto

modulo oggetto

modulo eseguibile

IL LINKER

• Il linker si occupa di ritrovare e collegare opportunamente

i moduli oggetto producendo un unico modulo eseguibile pronto per il caricamento in memoria e l’esecuzione

Elementi di Informatica e Programmazione – Università di Brescia 10Prof. M. Giacomin

int main(…){…

y=radicequadrata(7);

…}

float radicequadrata(float x){…

…}

main.c matematica.c

Ogni file contenente le chiamate a funzioni esterne (es. main.c)

deve includere i prototipi delle funzioni chiamate!

Scriverli in ogni file in cui le funzioni sono chiamate è dispendioso(oltre che fonte di errori!!!)

Problema: come gestire le funzioni nei diversi moduli sorgenti

Elementi di Informatica e Programmazione – Università di Brescia 11Prof. M. Giacomin

#include ”matematica.h”

int main(…){…

y=radicequadrata(7);

…}

#include ”matematica.h”

float radicequadrata(float x){…

…}

main.c matematica.c

float radicequadrata(float);

float logaritmo(float base, float n);

…matematica.h

Elementi di Informatica e Programmazione – Università di Brescia 12Prof. M. Giacomin

Come fare concretamente (A LINEA DI COMANDO)?

gcc –c main.c (produce main.o)

gcc –c matematica.c (produce matematica.o)

• Per compilare i sorgenti producendo moduli oggetto:

usare l’opzione –c del compilatore

gcc –o prova main.o matematica.o

• Per linkare i moduli oggetto producendo l’eseguibile:

usare gcc (che include il linker) nel modo seguente:

(linka main.o e matematica.o producendo l’eseguibile prova)

• Produrre i file sorgente ed i file “header” (.h) nella stessa directory

Elementi di Informatica e Programmazione – Università di Brescia 13Prof. M. Giacomin

Come fare concretamente con DEVC++?

1. Includere nel progetto tutti i file .c che lo compongono- Menu File/New/Source File oppure Menu Project/Source Fileper creare un file vuoto all'interno del progetto

- Menu Project/Add to Projectper aggiungere al progetto un file già esistente (es. scaricato)

Nota: i programmi nei file .c devono avere le direttive #includeper includere i file .h con i prototipi delle funzioni che usano

2. Generare i file header .h e metterli nella directory di progetto(insieme ai file .c)

3. Il codice può essere compilato con Execute/Rebuild All ed eseguito con Execute/Run

Elementi di Informatica e Programmazione – Università di Brescia 14Prof. M. Giacomin

LIBRERIE

• I file contenenti funzioni di uso comune possono essere utilizzati

in diversi programmi: creazione di librerie (moduli già compilati

disponibili a diversi programmi che includano gli header

corrispondenti)

• Il C prevede anche una libreria standard che fornisce

funzionalità comuni (es: input/output): ad essa corrispondono

moduli in linguaggio binario in una directory predefinita

• Gran parte di questi moduli (che si trovano in una directory

predefinita) viene collegata automaticamente dal linker

Elementi di Informatica e Programmazione – Università di Brescia 15Prof. M. Giacomin

Moduli Libreria standard

linkermodulo oggetto

modulo oggetto

modulo eseguibile

Elementi di Informatica e Programmazione – Università di Brescia 16Prof. M. Giacomin

Inclusione di file header per utilizzare la libreria standard

Inclusione intestazionilibrerie standard

#include<stdio.h>#include <stdlib.h>

#include “Mialibreria.h”

int main(int argc, char *argv[]){…system("pause"); // solo per Windows

}

Inclusione intestazionilibrerie utente

NB: in DEVC++ è sufficiente includere gli header e non preoccuparsi di nulla: i moduli della libreria standard verranno linkati automaticamente

Elementi di Informatica e Programmazione – Università di Brescia 17Prof. M. Giacomin

FILE DI INTESTAZIONE LIBRERIA STANDARD

Elementi di Informatica e Programmazione – Università di Brescia 17Prof. M. Giacomin

<assert.h>

<ctype.h>

<errno.h>

<float.h>

<limits.h>

<locale.h>

<math.h>

• Riferimenti:

- CAP. 8, 9, 11 del testo

- P.J. Plauger,

�The Standard C library�

Elementi di Informatica e Programmazione – Università di Brescia 18Prof. M. Giacomin

Matematica <math.h>

/* Calcola la radice quadrata di x che dev’essere non negativa*/

double sqrt (double x);

/* Calcola il logaritmo naturale di x, che dev’essere non negativo*/

double log(double x);

/* Calcola il logaritmo in base 10 di x, che dev’essere non negativo*/

double log10(double x);

/* Calcola x elevato alla potenza y. Il valore di x dev’essere non neg.*/

double pow(double x, double y);

Elementi di Informatica e Programmazione – Università di Brescia 19Prof. M. Giacomin

Matematica <math.h> (2)

/* Calcola il coseno di x (misurato in radianti)*/

double cos(double x);

/* Calcola il seno di x (misurato in radianti)*/

double sin(double x);

/* Suddivide valore in una parte intera e una frazionaria. Immagazzina

la parte intera come double nell’oggetto puntato da iptr. Restituisce la parte frazionaria*/

double modf(double valore, double *iptr);

Elementi di Informatica e Programmazione – Università di Brescia 20Prof. M. Giacomin

NOTA PER CHI LAVORA A LINEA DI COMANDO

Per utilizzare math.h, occorre indicare al compilatore di includere

esplicitamente la libreria con l’opzione -lm

Esempio: compilazione di un unico file sorgente (include linker)

gcc –o prova main.o matematica.o -lm

gcc –o prova prova.c -lm

(prova.c contiene il main e "usa" math.h)

Esempio: compilazione di due file in cui si "usa" math.h

gcc –c main.c

gcc –c matematica.c

Elementi di Informatica e Programmazione – Università di Brescia 21Prof. M. Giacomin

Limiti dell’implementazione <limits.h>

CHAR_MAX // Valore massimo per oggetti di tipo char

CHAR_MIN // Valore minimo per oggetti di tipo char

INT_MAX // Valore massimo per oggetti di tipo int

INT_MIN // Valore minimo per oggetti di tipo int

Definizione di MACRO mediante la direttiva #define

Elementi di Informatica e Programmazione – Università di Brescia 22Prof. M. Giacomin

APPENDICE

Elementi di Informatica e Programmazione – Università di Brescia 23Prof. M. Giacomin

#define identificatore(x1, x2, …,xn) testo-di-sostituzione

Definizione di macro parametriche

Macro parametriche

Esempio

#define PRINT_INT(n) printf(“%d\n”, n)

void main(…){…

PRINT_INT(i*j);…

}

IMP: no spazio!

Elementi di Informatica e Programmazione – Università di Brescia 24Prof. M. Giacomin

Compilazione condizionale (cenni)

Esempio1

#define DEBUG 1…#if DEBUG

printf(“Valore di x = %d\n”, x);

#endif

Esempio2a

#define DEBUG…#if defined(DEBUG)

printf(“Valore di x = %d\n”, x);

#endif

Esempio2b

#define DEBUG…#ifdef DEBUG

printf(“Valore di x = %d\n”, x);

#endif

Elementi di Informatica e Programmazione – Università di Brescia 25Prof. M. Giacomin

Compilazione condizionale (cenni)

#elif ha il significato di “else if”

#else ha il significato di “else”

Altre direttive

Alcuni utilizzi della compilazione condizionale

• Debugging

• Scrivere programmi portabili su diverse macchine

• Scrivere programmi compilabili su compilatori diversi