[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home] [volume] [parte]


Capitolo 589.   Organizzazione della libreria C

Complessivamente, la libreria C è ciò che consente l'uso di funzioni, macro-istruzioni e macro-variabili definite dallo standard (ed eventualmente dalle estensioni presenti nel proprio contesto). Generalmente le funzioni vengono fornite già compilate all'interno di una libreria dinamica o statica (per esempio possono essere i file /lib/libc.so o /usr/lib/libc.a), ma dal punto di vista formale, la libreria standard è costituita dai file di intestazione.

Per la precisione, lo standard stabilisce che si debba fare riferimento a delle «intestazioni» nel sorgente di un programma scritto in linguaggio C, ma il contesto particolare può essere tale per cui queste potrebbero non esistere fisicamente come ci si attenderebbe da un sistema operativo tradizionale. Anche per questo, nella documentazione standard ci si riferisce solo a intestazioni, senza precisare che debba trattarsi di file.

In pratica, i file di intestazione, o ciò che ne fa la funzione, sono sempre necessari e al loro interno si dichiarano le macro-variabili, le macro-istruzioni e almeno i prototipi delle funzioni, se queste sono già precompilate in un file separato. A ogni modo, di norma il compilatore è predisposto per utilizzare automaticamente i file precompilati necessari.

Nei capitoli successivi vengono descritti alcuni dei file di intestazione previsti dallo standard del linguaggio, mostrando come potrebbero essere realizzati e, in alcuni casi, anche fornendo una soluzione completa per le funzioni (gli esempi dovrebbero essere disponibili a partire da <allegati/a2/c/>).

Ciò che non si vede negli esempi dei capitoli successivi è la tecnica comune che si usa per evitare di includere ricorsivamente lo stesso file di intestazione più volte: si associa a ogni file una macro-variabile e se all'inizio della lettura questa non risulta dichiarata, il contenuto viene acquisito, altrimenti viene ignorato semplicemente, perché deve essere già stato incluso in precedenza. L'esempio seguente riguarda il file limits.h:

#ifndef _LIMITS_H
#define _LIMITS_H       1
    ...
    contenuto_del_file
    ...
#endif // _LIMITS_H

In pratica viene verificato se la macro-variabile _LIMITS_H è già stata definita; se lo è, il contenuto del file viene ignorato. Se invece la macro-variabile non è stata dichiarata, questa allora viene dichiarata e quindi si procede con il lavoro normale del file.

Tabella 589.2. File di intestazione standard.

Intestazione Descrizione Riferimenti
assert.h
Verifica diagnostica di un'espressione (asserzione). capitolo 590
complex.h
Aritmetica complessa. --
ctype.h
Classificazione dei caratteri. capitolo 595
errno.h
Definizione degli errori. capitolo 593
fenv.h
Gestione di valori in virgola mobile. --
float.h
Limiti dei valori in virgola mobile. --
inttypes.h
Estensione di stdint.h. capitolo 598
iso646.h
Macro-variabili da usare in sostituzione di vari operatori. capitolo 599
limits.h
Limiti per i numeri interi. capitolo 591
locale.h
Gestione della configurazione locale (nel senso di «localizzazione»). capitolo 594
math.h
Funzioni matematiche comuni. --
setjmp.h
Funzionalità per il salto incondizionato. --
signal.h
Gestione dei segnali. capitolo 603
stdarg.h
Gestione degli argomenti variabili. capitolo 596
stdbool.h
Tipo e valori booleani. capitolo 600
stddef.h
Definizioni comuni; in particolare i tipi size_t, wchar_t e il puntatore nullo NULL. capitolo 601
stdint.h
Definizioni di interi con un rango prestabilito, assieme ai valori minimi e massimi. capitolo 592
stdio.h
Gestione di input e output dei dati. capitolo 605
stdlib.h
Funzioni, macro e tipi di utilità generale. capitolo 597
string.h
Gestione delle stringhe. capitolo 602
tgmath.h
Macro-istruzioni matematiche, indipendenti dal tipo. --
time.h
Gestione di date e orari. capitolo 604
wchar.h
Gestione facilitata di caratteri estesi.
wctype.h
Classificazione dei caratteri estesi.

589.1   Funzionalità di libreria non dichiarate

Può succedere che il compilatore, per assolvere a funzionalità che figurano essere indipendenti da librerie, debba invece avvalersi di funzioni esterne che non sono previste dallo standard. In particolare, questo problema può verificarsi di fronte alla necessità di svolgere calcoli al di fuori della portata normale del microprocessore.

A titolo di esempio, il compilatore GNU C per la piattaforma x86-32 prevede un tipo intero long long int da 64 bit. Quando si vuole ottenere una divisione intera o il resto di una divisione con variabili di questo tipo, il compilatore GNU C richiama rispettivamente le funzioni __udivdi3() e __umoddi3(). In generale il problema non si avverte, ma se si vuole scrivere la propria libreria C, senza tali funzioni, in pratica non è possibile usare questo tipo intero molto grande.

589.2   Riferimenti


Appunti di informatica libera 2008 --- Copyright © 2000-2008 Daniele Giacomini -- <appunti2 (ad) gmail·com>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome organizzazione_della_libreria_c.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home]

Valid ISO-HTML!

CSS validator!

Gjlg Metamotore e Web Directory