Preprocessore, linker e libreria standard
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 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