I tidligere versioner af C, hvis en funktion ikke tidligere var deklareret og dens navn optrådte i et udtryk efterfulgt af en venstre parentes, blev den implicit deklareret som en funktion, der returnerer et int
, og der blev ikke antaget noget om dens argumenter. I dette tilfælde ville compileren ikke være i stand til at udføre compiletidskontrol af argumenttyper og syntaksaritet, når funktionen blev anvendt på nogle argumenter. Dette kan medføre problemer. Følgende kode illustrerer en situation, hvor en implicit deklareret funktions opførsel er udefineret.
#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); }}
Funktionen MyFunction forventer, at et heltalsargument befinder sig på stakken eller i et register, når den kaldes. Hvis prototypen udelades, har compileren ingen mulighed for at håndhæve dette, og MyFunction vil ende med at operere på et andet datum på stakken (muligvis en returadresse eller værdien af en variabel, der i øjeblikket ikke er i scope). Ved at medtage funktionsprototypen informerer du compileren om, at funktionen MyFunction tager ét heltalsargument, og du gør det muligt for compileren at opfange denne type fejl og få kompileringsprocessen til at forløbe gnidningsløst. Denne funktion blev fjernet fra C99-standarden, og udeladelse af en funktionsprototype vil derfor resultere i en kompileringsfejl.
Oprettelse af biblioteksgrænsefladerRediger
Gennem at placere funktionsprototyper i en headerfil kan man angive en grænseflade for et bibliotek.
KlassedeklarationRediger
I C++ anvendes funktionsprototyper også i klassedefinitioner.