En funktionsprototyp i C eller C++ är en funktionsdeklaration som inte innehåller en funktionskropp, utan anger funktionsnamn, arity , argumenttyper och returdatatyp . Medan en funktionsdefinition beskriver vad en funktion gör, kan en funktionsprototyp ses som en beskrivning av dess gränssnitt.
I prototypen är argumentnamnen valfria, men typen måste anges tillsammans med eventuella modifierare (till exempel om det är en pekare eller ett konstant argument).
Som ett exempel, betrakta följande funktionsprototyp:
int foo ( int n );Denna prototyp deklarerar en funktion som heter "foo" som tar ett argument "n" av en heltalstyp och returnerar ett heltal. En funktionsdefinition kan placeras var som helst i programmet, men deklarationen krävs bara om den används.
Om en funktion inte tidigare har deklarerats, och dess namn förekommer i ett uttryck omedelbart följt av en öppen parentes, deklareras den implicit som en funktion som returnerar ett typresultat intoch ingenting antas om dess argument. I det här fallet kommer kompilatorn inte att kunna utföra argumenttypkontroll och arity när funktionen anropas med vissa argument. Detta är en potentiell källa till problem. Följande kod illustrerar en situation där beteendet för en implicit deklarerad funktion är odefinierat.
#include <stdio.h> /* * När denna prototyp implementeras kommer kompilatorn att ge ett felmeddelande * i main(). Om det utelämnas kommer det inte att visas något felmeddelande. */ int foo ( int n ); /* Funktionsprototyp */ int main ( void ) /* Funktionsanrop */ { printf ( "%d \n " , foo ()); /* FEL: foo saknar ett argument! */ returnera 0 ; } int foo ( int n ) /* Funktion för att anropa */ { if ( n == 0 ) returnera 1 ; annars returnera n * foo ( n - 1 ); }Funktionen "foo" förväntar sig ett heltalsargument som finns i stacken när det anropas. Om prototypen utelämnas kan kompilatorn inte bearbeta den och "foo" kommer att hamna på annan stackdata (förmodligen returadressen eller värdet på en variabel utanför intervallet ). Genom att inkludera en funktionsprototyp informerar du kompilatorn om att "foo"-funktionen tar ett enda heltalsargument, och du tillåter kompilatorn att hantera dessa typer av fel.
Genom att placera funktionsprototyper i en rubrikfil kan du definiera ett gränssnitt för .
I C++ används funktionsprototyper också i klassdefinitioner .