C/Blocchi e funzioni/Funzioni

Indice del libro

Il linguaggio C permette di scomporre il codice in sottoparti da poter riutilizzare in seguito. Questa funzionalità è resa disponibile dalle funzioni.

Prototipi

modifica

Per poter fare uso di una funzione è necessario definirne il prototipo, ossia il nome, il tipo di valore restituito e il tipo degli argomenti. La sintassi di un prototipo è la seguente:

tipo_restituito nome_funzione(elenco_tipi_argomenti);

dove tipo_restituito è uno dei tipi base o di quelli definiti dal programmatore e lo stesso vale per l'elenco dei tipi degli argomenti. L'elenco dei tipi degli argomenti può essere sostituito dalla parola void per indicare che la funzione non ha argomenti oppure essere costituita da almeno un tipo e in ultima posizione ... ad indicare che seguono un numero variabile di argomenti, per chiarire:

tipo_restituito nome_funzione(tipo1, tipo2, ...);

Il prototipo della funzione va messo prima della funzione main, successivamente la funzione può essere chiamata in qualsiasi punto del file sorgente; la definizione vera e propria della funzione può essere posta ovunque nel sorgente al di fuori di altre funzioni e comunque dopo i prototipi, ma come pratica diffusa si mettono dopo la funzione main.

Definizione di una funzione

modifica

Le funzioni in C si definiscono in questo modo:

 tipo funzione(tipo1 par1, ..., tipoN parN)
 {
     istruzione1;
     ...
     istruzioneN;
 
     return valore_restituito;
 }

Se il tipo di valore da restituire è void, indica che non viene restituito nessun valore.

In questo caso l'istruzione return è facoltativa. Può servire per un'uscita prematura, cioè per terminare la funzione prima di giungere alla fine.

Se la funzione è stata dichiarata per restituire void, essa non restituirà alcun valore: l'istruzione return delle funzioni che rendono un void non ammette parametri.

Lo standard afferma che una funzione che non accetta argomenti nella dichiarazione tra le parentesi tonde deve avere la parola void, poi per richiamare tale funzione se ne scrive il nome seguito da una coppia di parentesi tonde aperta e chiusa.

La definizione può fungere anche da prototipo se posta prima della funzione main e prima del prototipo di una funzione che ne fa uso. Esempio:

int somma (int a, int b) // prototipo e definizione
{
    return a + b;
}
void messaggio (void)
{
    printf("Il risultato è:\n");
}
int main (void)
{
    int a, b, c;
    a = b = 2;
    c = somma (a, b);
    messaggio();
    printf ("%d",c);
}

Il risultato sarà:

Il risultato è
4

main è la funzione principale che viene chiamata all'avvio del programma.