• Non ci sono risultati.

Libreria standard del C

Nel documento DI FUSCO FRANCESCO (pagine 105-110)

La Libreria standard del C é una raccolta di header file e librerie di funzioni usate per implementare operazioni comuni, come l'input/output e l'elaborazione di stringhe nel linguaggio di programmazione C. Diversamente da altri linguaggi come il Pascal ed il PL/I, il C non include keyword integrate per questi scopi, quindi quasi tutti i programmi C si basano sulla libreria standard per funzionare.

Il nome e le caratteristiche di ogni funzione sono incluse in un file chiamato header file

 

ma l'implementazione vera e propria delle funzioni é in un file di libreria separato. I nomi e gli obiettivi degli header sono diventati comuni ma l'organizzazione delle librerie rimane non uniforme tra i vari compilatori. La libreria standard é solitamente inclusa con il compilatore. Dato che i compilatori C spesso forniscono funzionalità extra che non sono specificate nel C ANSI, una libreria standard con un particolare compilatore é spesso incompatibile con librerie standard di altri compilatori.

Gran parte della libreria standard del C ha dimostrato di essere costruita bene. Qualche parte, con il senno di poi, é vista come mal costruita. La funzione di input gets() (e l'uso di scanf() per leggere input di stringhe) sono fonte di molti buffer overflow, e la maggior parte delle guide di programmazione raccomandano di non farne questo utilizzo. Un'altra stranezza é strtok(), una funzione che é costruita come un primitivo analizzatore lessicale ma é molto "fragile" e difficile da usare.

Storia

Il linguaggio C, prima di essere standardizzato, non aveva a disposizione alcune funzionalità come ad esempio le operazioni di I/O (diversamente da altri linguaggi tradizionali quali il Pascal ed il Fortran). Col passare del tempo, le comunità di utenti del C condivisero idee ed implementazioni di quelle che ora noi chiamiamo librerie standard del C per sopperire a queste mancanze. Molte di quelle idee furono incorporate nelle definizioni del linguaggio C standardizzato.

Sia UNIX che il C furono creati ai laboratori Bell dell'AT&T nei tardi anni 60 e nei primi anni 70. Durante gli anni 70 il linguaggio C divenne sempre più famoso. Molte università e organizzazioni iniziarono a creare le loro

variazioni del linguaggio per i loro progetti. Dagli inizi degli anni 80 iniziarono a diventare evidenti problemi di compatibilità tra le varie implementazioni del C. Nel 1983 l'ANSI (American National Standards Institute) formò un comitato per stabilire una specifica standard del C conosciuto come "C ANSI". Questo lavoro culminò nella creazione dello standard C89 nel 1989. Parte dello standard risultante era un set di librerie chiamato libreria standard del C ANSI.

Successive revisioni del C standard hanno aggiunto numerosi header file alla libreria. Il supporto per queste nuove estensioni dipende dalle implementazioni.

Gli header <iso646.h>, <wchar.h>, e <wctype.h> furono aggiunti con il Normative Amendment 1 (d'ora innanzi abbreviato con NA1), un'aggiunta al C standard ratificata nel 1995.

Gli header <complex.h>, <fenv.h>, <inttypes.h>, <stdbool.h>, <stdint.h>, e <tgmath.h> furono aggiunti con il C99, una revisione al C standard pubblicata nel 1999

Standard ANSI

La libreria C ANSI standard consiste in 24 header file C che possono essere inclusi nel progetto di un programmatore con una singola direttiva. Ogni header consiste in una o più dichiarazioni di funzioni, definizioni di tipi e macro. Il contenuto di questi header file si può trovare più avanti.

Rispetto ad altri linguaggi (per esempio il Java) la libreria standard è molto piccola. Questa dispone di un set base di funzioni matematiche, funzioni per la manipolazione di stringhe, conversione di tipi e I/O da file e da console. Non contiene un set standard di "contenitori di tipi" come la libreria standard dei template del C++, non dispone nemmeno di tool per creare interfacce grafiche per utenti (GUI), strumenti per la rete e molte altre funzionalità di cui dispone il Java. Il vantaggio principale di una libreria piccola e che è più facile fornire un ambiente ANSI C funzionante rispetto ad altri linguaggi, e conseguentemente è relativamente facile fare porting verso altre piattaforme.

Molte altre librerie sono state sviluppate per fornire le funzionalità equivalenti a quelle a quelle fornite da altri linguaggi nelle loro librerie standard. Per esempio, il progetto di ambiente desktop GNOME ha permesso di

sviluppare il tool grafico GTK+ e la Glib, una libreria contenente strutture dati, e ci sono molti altri esempi conosciuti. La varietà di librerie disponibili è spiegabile con il fatto che alcune librerie, migliori di altre, hanno dimostrato la propria superiorità con il passare del tempo. Il problema principale è che spesso diverse librerie non funzionano bene insieme e i programmatori che sono pratici con alcuni set di librerie potrebbero trovarne set diversi su differenti piattaforme.

stdlib.h

stdlib.h è l'header file che, all'interno della libreria standard del C, dichiara funzioni e costanti di utilità generale: allocazione della memoria, controllo dei processi, conversione tra tipi e così via. È compatibile con il C++ ed è noto in quell'ambito con il nome cstdlib.

Funzioni

Le funzioni di stdlib.h possono essere classificate nelle seguenti categorie:

1. conversione tra tipi, 2. gestione della memoria, 3. controllo dei processi, 4. ricerca ed ordinamento, 5. matematica semplice.

Nome Descrizione

Conversione tra tipi

atof Converte una stringa in un numero in virgola mobile. atoi Converte una stringa in un numero intero.

atol Converte una stringa in un numero intero lungo (long int). strtod Converte una stringa in un double, effettuando dei controlli

sull'overflow e restituendo anche l'eventuale parte non convertita della stringa.

strtol Converte una stringa, che rappresenta un numero in una base arbitraria compresa tra 2 e 36, in un double (numero a

virgola mobile), effettuando dei controlli sull'overflow e restituendo anche l'eventuale parte non convertita della stringa.

strtoul Equivalente a strtol() tranne per il tipo del risultato, che è unsigned long

Allocazione e deallocazione di memoria calloc,

malloc, realloc

Funzioni che si occupano dell'allocazione dinamica della memoria

free Libera la memoria allocata dinamicamente dalla famiglia di funzioni malloc()

Controllo dei processi

abort Causa la terminazione immediata ed anormale del programma, come se fosse stato invocato raise(SIGABRT)

atexit Registra una funzione, della quale le viene passato il puntatore, affinché venga eseguita appena prima della normale terminazione del programma.

exit Causa la normale terminazione del programma. Tutte le funzioni registrate con atexit() vengono eseguite con ordine inverso rispetto alla loro registrazione, gli stream associati al programma vengono liberati, i file vengono scritti su disco (vedere flush()) ed il controllo viene restituito all'ambiente chiamante, assieme ad un valore numerico, che generalmente indica lo stato del programma o la causa della sua terminazione, che deve essere fornito alla funzione stessa.

getenv Restituisce la stringa che nell'ambiente di lavoro del programma è associata al nome fornito, oppure NULL se non esiste alcuna stringa. I dettagli della funzione sono strettamente dipendenti dal sistema operativo.

system Passa la stringa fornitole all'ambiente di lavoro per l'esecuzione e restituisce il codice d'uscita del comando invocato. Se si fornisce NULL, informa sulla eventuale presenza nel sistema di un processore di comandi.

Ricerca ed ordinamento

bsearch Implementa in maniera generica l'algoritmo di ricerca dicotomica

qsort Implementa in maniera generica l'algoritmo di ordinamento quicksort

abs,

labs Calcola il valore assoluto dell'argomento. div,

Nel documento DI FUSCO FRANCESCO (pagine 105-110)

Documenti correlati