# Libreria standard del C

* Libreria standard del C++
* Libreria standard del C
* <assert.h>
* <ctype.h>
* <errno.h>
* <float.h>
* <iso646.h>
* <limits.h>
* <math.h>
* <stddef.h>
* <stdio.h>
* <stdlib.h>
* <string.h>
* <time.h>
* V · D · M
La libreria standard del C è un insieme di librerie che forniscono al programmatore funzioni tipizzate. Insieme alla libreria vengono inoltre forniti gli Header file, file di testo che permettono al programmatore di utilizzare lo specifico insieme di funzioni della libreria ad esse associate.

## Storia

Il Linguaggio C è nato come sostegno allo sviluppo del sistema UNIX, implementato su determinate macchine tipizzate. Con l'evoluzione dell'architettura delle macchine e dal bisogno di un linguaggio universale, nacque l'esigenza di scrivere un codice portabile che permettesse l'evolversi del linguaggio a seconda delle necessità.
L'American National Standards Institute nel 1983 creò il comitato ANSI X3J11 al fine di dare "una definizione del linguaggio C non ambigua e non dipendente dalla macchina" che culminò nel 1989 con la pubblicazione dello standard C89, parte del quale consisteva in un set di librerie chiamato librerie standard del C . Questo venne riconosciuto internazionalmente come ANSI C o ANSI/ISO C, dopo che, nel 1990, venne approvato dall'International Standardization Organization. Ad oggi questo standard è usato alla base di tutti i compilatori C. Le formalizzazioni di maggior rilievo introdotte dallo standard furono una nuova forma di definizione e dichiarazione di funzione e l'introduzione della libreria standard del C, che introdusse per la prima volta fondamentali elementi del linguaggio ad oggi conosciuto, ad esempio, l'Input/Output, la gestione degli errori e la tipizzazione dei caratteri.
Nel 1995, la ISO introdusse la Normative Amendment 1, abbreviando AM1, formalmente riconosciuta ISO/IEC 9899/AMD1:1995. Il progetto AM1 si concentrò principalmente sull'ampliamento della libreria standard introducendo nuovi header.
Nel 1999, l'ANSI pubblicò la revisione dello standard C89, il C99, adottato nel 2000 e conosciuto formalmente come ISO/IEC 9899:1999. Lo standard C99 prevede l'aggiunta di Header ed il miglioramento di funzioni e librerie, in particolare <math.h>.
Successivamente al C99 furono pubblicati altri due standard, sempre più specifici con il fine di supportare al meglio il lavoro del compilatore e del linker.
Il C11, adottato nel 2011, standardizza il modello della memoria per supportare al meglio la programmazione multi thread.
Il C18, ultimo standard del 2018, non introduce nuove caratteristiche ma è mirato a risolvere difetti dello standard precedente.
Il fine ultimo dello standard è quella di promuovere la portabilità, affidabilità, manutenibilità ed efficienza dei programmi in C sulla grande varietà di macchine.

## Design

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. Essendo già presente la libreria nei compilatori, non è necessario allegarla al progetto in cui questa viene utilizzata, è però necessario includere attraverso la direttiva #include, le funzioni della libreria che si usano nel file, con qualsiasi ordine.
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) è fonte di molti buffer overflow, e la maggior parte delle guide di programmazione raccomandano di non farne uso. Un'altra stranezza è strtok, una funzione che è costruita come un primitivo analizzatore lessicale ma è molto "fragile" e difficile da usare.

## Standard ANSI

La libreria C ANSI standard consiste in 24 header file C, 15 da C89 e 9 da C99, 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 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.
Una particolarità della Libreria Standard del C è che, dovendo includere più header, non importa l'ordine con cui questi vengono posti, a meno che la libreria assert.h sia la prima, essendo questa a gestire gli errori.

## Libreria degli header file del C ANSI

| Nome | Descrizione |
| <assert.h> | Contiene la macro assert, utilizzata per identificare errori logici ed altri tipi di bug nelle versioni di debug di un programma. |
| <complex.h> | Un gruppo di funzioni usate per manipolare numeri complessi. (Aggiunto con il C99) |
| <ctype.h> | Questo header file contiene funzioni usate per classificare i caratteri in base ai loro tipi o per convertirli da maiuscoli a minuscoli, indipendentemente dal set di caratteri utilizzato (tipicamente ASCII, ma esistono anche implementezioni che usano l'EBCDIC). |
| <errno.h> | Per testare i codici di errore restituiti dalle funzioni di libreria. |
| <fenv.h> | Per controllare l'ambiente in virgola mobile. (Aggiunto con il C99) |
| <float.h> | Contiene delle costanti definite che indicano le proprietà specifiche dell'implementazione della libreria in virgola mobile, come ad esempio la minima differenza tra due numeri in virgola mobile (_EPSILON), il massimo numero di cifre significative (_DIG) e l'intervallo di numeri che possono essere rappresentati (_MIN, _MAX). |
| <inttypes.h> | Per effettuare conversioni precise tra i tipi interi. (Aggiunto con il C99) |
| <iso646.h> | Per programmare nel set di caratteri ISO 646. (Aggiunto con l'NA1) |
| <limits.h> | Contiene delle costanti definite che indicano le proprietà specifiche dell'implementazione dei tipi interi, come l'intervallo dei numeri rappresentabili (_MIN, _MAX). |
| <locale.h> | Per setlocale e le costanti relative. Utilizzato per scegliere il codice locale adatto. |
| <math.h> | Per le funzioni matematiche comuni. |
| <setjmp.h> | Dichiara setjmp/longjmp, utilizzate per salti non locali. |
| <signal.h> | Per controllare varie condizioni d'eccezione. |
| <stdarg.h> | Utilizzato da funzioni che accettano un numero variabile di parametri. |
| <stdbool.h> | Per un tipo di dato booleano. (Aggiunto con il C99) |
| <stdint.h> | Per definire vari tipi interi. (Aggiunto con il C99) |
| <stddef.h> | Per definire vari tipi e macro utili. |
| <stdio.h> | Fornisce le funzionalità basilari di input/output del C. Questo file include il prototipo delle venerabili funzioni printf e scanf. |
| <stdlib.h> | Per eseguire un gran numero di operazioni, tra cui conversioni, generazione di numeri pseudo-casuali, allocazione di memoria, controllo del processo, variabili d'ambiente, segnali, ricerca ed ordinamento. |
| <string.h> | Per manipolare le stringhe. |
| <tgmath.h> | Per funzioni matematiche di tipo generico. (Aggiunto con il C99) |
| <time.h> | Per convertire tra vari formati di data e ora. |
| <wchar.h> | Per manipolare stream o stringhe contenenti caratteri estesi - fondamentale per supportare una lunga serie di lingue con caratteri non occidentali. (Aggiunto con l'NA1) |
| <wctype.h> | Per la classificazione dei caratteri estesi. (Aggiunto con l'NA1) |

## La libreria standard del C nel C++

Il C++ include le funzionalità della libreria standard del C ANSI, ma apporta numerose modifiche, come la modifica del nome degli header file da <xxx.h> a <cxxx> (i nomi nello stile C sono ancora disponibili, ma sono considerati obsoleti) oppure l'inserimento di tutti gli identificatori nello spazio dei nomi (namespace) std.

## Librerie comuni di supporto

Nonostante questo comportamento non sia standardizzato, i programmi C potrebbero dipendere da una libreria di funzioni di runtime che contengono del codice che il compilatore usa al momento dell'esecuzione. Il codice che inizializza il processo per il sistema operativo prima della chiamata del main, ad esempio, è implementato nella Libreria di Runtime del C di ogni specifico compilatore. Il codice della libreria di runtime potrebbe essere utile per eventuali future implementazioni del linguaggio, come ad esempio la gestione delle eccezioni o l'implementazione di codice in virgola mobile.
La libreria standard del C documenta soltanto che le specifiche funzioni menzionate in questo articolo sono disponibili e come si comportano. Poiché l'implementazione del compilatore potrebbe dipendere dalle funzioni addizionali presenti nella libreria di runtime, capita spesso che le routine specifiche del produttore siano aggiunte negli stessi moduli della libreria standard, dato che è molto probabile che un programma creato con questo compilatore necessiti di entrambe le cose.
Nonostante la confusione causata da questa aggiunta, la libreria di runtime del C non è una parte standardizzata del linguaggio e dipende dal produttore.