Preprocessore, linker e libreria standard Università degli Studi di Brescia Prof. Massimiliano Giacomin Elementi di Informatica e Programmazione Università di Brescia 1
IL PREPROCESSORE Programma sorgente Preprocessore Programma sorgente modificato Compilatore Programma eseguibile Linguaggio C Linguaggio C Linguaggio macchina 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 2
PRINCIPALI DIRETTIVE DEL PREPROCESSORE Definizione di macro - 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 modo condizionato (es: in alternativa) sulla base delle macro definite - non esaminate qui (per gli appassionati: vedi appendice) NB: le direttive possono essere poste ovunque nel file Elementi di Informatica e Programmazione Università di Brescia 3
Definizione di macro (1) Macro semplici #define identificatore testo-di-sostituzione Esempio #define ITERAZIONI 200 //numero di iterazioni void main(){ for(i=1; i<=iterazioni; i++){ } Vantaggi Modificabilità + Leggibilità Elementi di Informatica e Programmazione Università di Brescia 4
Definizione di macro (2) Macro parametriche IMP: no spazio! #define identificatore(x1, x2,,xn) testo-di-sostituzione Esempio #define PRINT_INT(n) printf( %d\n, n) void main(){ PRINT_INT(i*j); } Elementi di Informatica e Programmazione Università di Brescia 5
Inclusione di file 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 NB: vediamo un utilizzo comune Elementi di Informatica e Programmazione Università di Brescia 6
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 mediante un programma detto linker Elementi di Informatica e Programmazione Università di Brescia 7
COMPILAZIONE SEPARATA programma sorgente matematica.c preprocessore + compilatore Modulo oggetto matematica.o programma sorgente main.c preprocessore + compilatore Modulo oggetto main.o I moduli oggetto contengono codice in linguaggio binario non direttamente eseguibile (cf. riferimenti esterni) + informazioni supplementari Elementi di Informatica e Programmazione Università di Brescia 8
IL LINKER modulo oggetto modulo oggetto modulo oggetto linker modulo eseguibile 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 9
Problema: come gestire le funzioni nei diversi moduli sorgenti Il file contenente le chiamate a funzioni esterne (main.c) deve includere i prototipi delle funzioni chiamate! Scriverli in ogni programma che usa la libreria è dispendioso (oltre che fonte di errori!!!) int main(){ } y=radicequadrata(7); main.c float radicequadrata(float x){ } matematica.c Elementi di Informatica e Programmazione Università di Brescia 10
float radicequadrata(float); float logaritmo(float base, float n); matematica.h #include matematica.h int main(){ } y=radicequadrata(7); main.c #include matematica.h float radicequadrata(float x){ } matematica.c Elementi di Informatica e Programmazione Università di Brescia 11
Come fare concretamente? Produrre i file sorgente ed i file header (.h) nella stessa directory Per compilare i sorgenti producendo moduli oggetto: usare l opzione c del compilatore gcc c main.c gcc c matematica.c (produce main.o) (produce matematica.0) Per linkare i moduli oggetto producendo l eseguibile: usare gcc (che include il linker) nel modo seguente: gcc o prova main.o matematica.o (linka main.o e matematica.o producendo l eseguibile prova) Elementi di Informatica e Programmazione Università di Brescia 12
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 13
Moduli Libreria standard modulo oggetto linker modulo eseguibile modulo oggetto Elementi di Informatica e Programmazione Università di Brescia 14
Inclusione di file header per utilizzare la libreria standard #include<stdio.h> #include <stdlib.h> #include Mialibreria.h Inclusione intestazioni librerie standard Inclusione intestazioni librerie utente int main(int argc, char *argv[]){ system("pause"); } Elementi di Informatica e Programmazione Università di Brescia 15
FILE DI INTESTAZIONE LIBRERIA STANDARD <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 16 16
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 17
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 18
ATTENZIONE 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 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 gcc o prova main.o matematica.o -lm Elementi di Informatica e Programmazione Università di Brescia 19
Limiti dell implementazione <limits.h> Definizione di MACRO mediante la direttiva #define 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 Elementi di Informatica e Programmazione Università di Brescia 20
APPENDICE Elementi di Informatica e Programmazione Università di Brescia 21
Compilazione condizionale (cenni) Esempio1 #define DEBUG 1 #if DEBUG printf( Valore di x = %d\n, x); #endif Esempio2a Esempio2b #define DEBUG #if defined(debug) printf( Valore di x = %d\n, x); #endif #define DEBUG #ifdef DEBUG printf( Valore di x = %d\n, x); #endif Elementi di Informatica e Programmazione Università di Brescia 22
Compilazione condizionale (cenni) Altre direttive #elif #else ha il significato di else if ha il significato di else Alcuni utilizzi della compilazione condizionale Debugging Scrivere programmi portabili su diverse macchine Scrivere programmi compilabili su compilatori diversi Elementi di Informatica e Programmazione Università di Brescia 23