Nelle versioni precedenti del C, se una funzione non era stata dichiarata in precedenza e il suo nome compariva in un’espressione seguita da una parentesi sinistra, veniva implicitamente dichiarata come una funzione che restituisce un int
e non si assumeva nulla sui suoi argomenti. In questo caso il compilatore non sarebbe stato in grado di eseguire il controllo in fase di compilazione dei tipi di argomenti e dell’aritmetica quando la funzione veniva applicata ad alcuni argomenti. Questo può causare problemi. Il seguente codice illustra una situazione in cui il comportamento di una funzione dichiarata implicitamente è indefinito.
#include <stdio.h>/* If this prototype is provided, the compiler will catch the error in * |main|. If it is omitted, then the error may go unnoticed. */int MyFunction(int n); /* Prototype */int main( void ) /* Calling function */{ printf("%d\n", MyFunction()); /* Error: forgot argument to MyFunction */ return 0;}int MyFunction( int n ) /* Called function definition */{ if (n == 0) { return 1; } else { return n * MyFunction(n - 1); }}
La funzione MyFunction si aspetta che un argomento intero sia sullo stack o in un registro quando viene chiamata. Se il prototipo viene omesso, il compilatore non avrà modo di farlo rispettare e MyFunction finirà per operare su qualche altro dato sullo stack (forse un indirizzo di ritorno o il valore di una variabile che non è attualmente nello scope). Includendo il prototipo della funzione, si informa il compilatore che la funzione MyFunction prende un argomento intero e si permette al compilatore di catturare questo tipo di errori e far funzionare il processo di compilazione senza problemi. Questa caratteristica è stata rimossa dallo standard C99, quindi l’omissione di un prototipo di funzione risulterà in un errore di compilazione.
Creazione di interfacce di libreriaModifica
Mettendo i prototipi di funzione in un file di intestazione, si può specificare un’interfaccia per una libreria.
Dichiarazione di classeModifica
In C++, i prototipi di funzione sono usati anche nelle definizioni di classe.