A C korábbi verzióiban, ha egy függvényt nem deklaráltak korábban, és a neve egy kifejezésben szerepelt, amelyet egy bal zárójel követett, akkor implicit módon egy int
-t visszaadó függvényként volt deklarálva, és semmit sem feltételeztek az argumentumairól. Ebben az esetben a fordító nem tudta volna elvégezni az argumentumtípusok és a szintaxis aritásának fordítási idejű ellenőrzését, amikor a függvényt néhány argumentumra alkalmazták. Ez problémákat okozhat. A következő kód egy olyan helyzetet szemléltet, amikor egy implicit módon deklarált függvény viselkedése meghatározatlan.
#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); }}
A MyFunction függvény elvárja, hogy egy egész szám argumentum a veremben vagy egy regiszterben legyen a hívásakor. Ha a prototípust elhagyjuk, a fordító nem tudja ezt kikényszeríteni, és a MyFunction végül a verem valamely más adatán (esetleg egy visszatérési címen vagy egy olyan változó értékén, amely éppen nincs hatókörben) fog működni. A függvény prototípusának megadásával tájékoztatjuk a fordítót, hogy a MyFunction függvény egy egész szám argumentumot vesz fel, és lehetővé tesszük a fordító számára, hogy az ilyen típusú hibákat elkapja, és a fordítási folyamat zökkenőmentesen haladjon. Ezt a funkciót a C99 szabványból eltávolították, így a függvényprototípus elhagyása fordítási hibát eredményez.
Könyvtári interfészek létrehozásaSzerkesztés
A függvényprototípusok fejlécfájlban való elhelyezésével megadhatjuk egy könyvtár interfészét.
OsztálydeklarációSzerkesztés
A C++-ban a függvényprototípusok az osztálydefiníciókban is használatosak.