W poprzednich wersjach języka C, jeśli funkcja nie była wcześniej zadeklarowana, a jej nazwa występowała w wyrażeniu, po którym następował lewy nawias, była ona domyślnie deklarowana jako funkcja zwracająca int
i nic nie było zakładane o jej argumentach. W takim przypadku kompilator nie byłby w stanie wykonać w czasie kompilacji sprawdzania typów argumentów i składni, gdy funkcja została zastosowana do niektórych argumentów. Może to powodować problemy. Poniższy kod ilustruje sytuację, w której zachowanie niejawnie zadeklarowanej funkcji jest niezdefiniowane.
#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); }}
Funkcja MyFunction oczekuje, że argument integer będzie na stosie lub w rejestrze, gdy zostanie wywołana. Jeśli prototyp zostanie pominięty, kompilator nie będzie miał jak tego wymusić i funkcja MojaFunkcja będzie operować na innych danych na stosie (być może na adresie zwrotnym lub wartości zmiennej, która nie jest obecnie w zakresie). Włączając prototyp funkcji, informujesz kompilator, że funkcja MojaFunkcja przyjmuje jeden argument typu integer i umożliwiasz kompilatorowi wyłapanie tego typu błędów i sprawić, że proces kompilacji będzie przebiegał płynnie. Funkcja ta została usunięta ze standardu C99, dlatego pominięcie prototypu funkcji spowoduje błąd kompilacji.
Tworzenie interfejsów bibliotekEdit
Przez umieszczenie prototypów funkcji w pliku nagłówkowym można określić interfejs dla biblioteki.
Deklaracja klasyEdit
W języku C++ prototypy funkcji są również używane w definicjach klas.