Jos funktiota ei ollut aiemmin ilmoitettu ja sen nimi esiintyi lausekkeessa, jota seurasi vasen sulku, se ilmoitettiin epäsuorasti funktioksi, joka palauttaa int
, eikä sen argumenteista oletettu mitään. Tällöin kääntäjä ei pystynyt suorittamaan argumenttityyppien ja syntaksin ariteetin tarkastusta kääntämisen aikana, kun funktiota sovellettiin joihinkin argumentteihin. Tämä voi aiheuttaa ongelmia. Seuraava koodi havainnollistaa tilannetta, jossa implisiittisesti ilmoitetun funktion käyttäytyminen on määrittelemätöntä.
#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); }}
Funktio MyFunction odottaa, että kokonaislukuargumentti on pinossa tai rekisterissä, kun sitä kutsutaan. Jos prototyyppi jätetään pois, kääntäjällä ei ole mitään keinoa valvoa tätä, ja MyFunction päätyy toimimaan johonkin muuhun pinossa olevaan dataan (mahdollisesti paluuosoitteeseen tai sellaisen muuttujan arvoon, joka ei tällä hetkellä ole scopeissa). Sisällyttämällä funktion prototyypin ilmoitat kääntäjälle, että funktio MyFunction ottaa yhden kokonaislukuargumentin, ja annat kääntäjälle mahdollisuuden havaita tällaiset virheet ja tehdä kääntämisestä sujuvaa. Tämä ominaisuus poistettiin C99-standardista, joten funktion prototyypin poisjättäminen johtaa kääntämisvirheeseen.
Kirjastojen rajapintojen luominenMuokkaa
Sijoittamalla funktioiden prototyyppejä otsikkotiedostoon voidaan määritellä kirjaston rajapinta.
Luokkien ilmoittaminenMuokkaa
C++:ssa funktioiden prototyyppejä käytetään myös luokkamääritelmissä.