Creazione di librerie�inclusione di file esterni
3^ INFORMATICO - IIS PASCAL�DIPARTIMENTO INFORMATICA
2
ARGOMENTI
3
DEFINIZIONE
Per “libreria” si intende
“un insieme di funzioni o strutture dati predefinite e predisposte per essere riutilizzate da altri programmi software attraverso un'opportuna procedura di collegamento.
Il termine libreria nasce da una fallace trasposizione lessicale dell'inglese library (lett. "biblioteca"), ma ormai è così diffuso nel vocabolario dei professionisti da essere accettato quale possibile traduzione.”[Wikipedia]
l’idea è di creare delle funzioni una sola volta e usarle ovunque sia necessario senza reinventare la ruota tutte le volta
Creare una libreria personalizzata
Creare una libreria personalizzata
Fin dal primo esempio di codice incontrato, abbiamo visto istruzioni�del tipo� #include <iostream>
utilizzata, ad esempio, per poter usare cin e cout
Ma perché?
Perché in C++ esistono appunto due file iostream.h e iostream.cpp �(della libreria standard libstdc++) già pronti che qualcuno (per fortuna) ha già implementato e che possiamo usare senza doverli reinventare
A destra un estratto del codice del file iostream.h�ref: https://gcc.gnu.org/onlinedocs/gcc-4.6.2/libstdc++/api/a00911_source.html
Creare una libreria personalizzata
E’ possibile creare librerie con i propri codici per evitare di doverli riscrivere (o copiarli) ogni volta.
Vediamo un esempio:
immaginiamo di aver scritto la funzione di ordinamento per gestire l’ordinamento di un array di interi…
Creare una libreria personalizzata
Proprio perché è generica, sarebbe bello poterla usare in vari programmi senza doverla copiare e/o riscrivere
Possiamo quindi usare la possibilità di includere files esterni in una applicazione
Buona norma è utilizzare due file diversi:
in CodeBlocks procedo in questo modo:�Menu: File -> New -> File
e selezioniamo� C/C++ header
Creare una libreria personalizzata
Scegliamo il nome che vogliamo dare alla nostra libreria (ad esempio mytools.h)
e selezioniamo il path in cui salvarla
�per adesso possiamo scegliere di salvarla insieme al progetto
NOTA:
Codeblocks suggerisce il nome da dare alla header_guard ovvero una #define che impedisce di includere lo stesso file di libreria più volte all’interno dello stesso progetto
possiamo lasciare il nome suggerito (che è quello standard)
Creare una libreria personalizzata
Otteniamo quanto in figura:
Codeblocks crea una directory “Headers” con dentro il nostro file mytools.h�e crea il contenuto del file con solo la header_guard
All’interno del file mytools.h inseriremo le dichiarazioni delle funzioni di libreria che vogliamo implementare ed eventualmente tipi dato astratti
Creare una libreria personalizzata
Aggiungiamo quindi la dichiarazione della funzione ordina senza aggiungere il corpo dell’implementazione
Creare una libreria personalizzata
Andiamo quindi ad includere mytools.h nel main per poter usare la funzione lì definita.�Appena una sintassi diversa perché usiamo i doppi apici invece dei brackets (riservati alle librerie standard del linguaggio memorizzate nelle directory apposite)
Provando a compilare ottengo un errore perché non trovo l’implementazione
||=== Build: Debug in 10_uso_di_librerie (compiler: GNU GCC Compiler) ===|
/usr/bin/ld: obj/Debug/main.o||in function `main':|
...main.cpp|7|undefined reference to `void ordina<int>(int*, int)'|
||error: ld returned 1 exit status|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
Creare una libreria personalizzata
Procedo adesso a creare il file .cpp per l’implementazione della funzione�Menu: File -> New -> File
selezioniamo C/C++ source e salviamo con lo stesso nome dell’header ma con estensione .cpp�Il file viene inserito nella directory “Sources” ed è vuoto
Creare una libreria personalizzata
Aggiungiamo quindi il corpo della funzione ordina in mytools.cpp
Nota che non c’è bisogno di includere mytools.h perché è già inclusa dal main…
La compilazione adesso restituisce un messaggio positivo….
-------------- Build: Debug in 10_uso_di_librerie (compiler: GNU GCC Compiler)---------------
g++ -Wall -fexceptions -g -c mytools.cpp -o obj/Debug/mytools.o
g++ -o bin/Debug/10_uso_di_librerie obj/Debug/main.o obj/Debug/mytools.o
Output file is bin/Debug/10_uso_di_librerie with size 36.68 KB
Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))
Creare una libreria personalizzata
Posso ora lavorare nel main tranquillamente….
La compilazione adesso restituisce un messaggio positivo….
-------------- Build: Debug in 10_uso_di_librerie (compiler: GNU GCC Compiler)---------------
g++ -Wall -fexceptions -g -c mytools.cpp -o obj/Debug/mytools.o
g++ -o bin/Debug/10_uso_di_librerie obj/Debug/main.o obj/Debug/mytools.o
Output file is bin/Debug/10_uso_di_librerie with size 36.68 KB
Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))
Creare una libreria personalizzata : templates
NOTA: Nel caso di librerie contenenti funzioni templates, queste devono essere dichiarate e implementate nel file.h (spesso chiamato .hpp in questi casi) per evitare problemi di linking
Esercizi
Le librerie sono ancora più utili se contengono funzioni e strutture template (come la STL)