Prototipo di funzione

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.