Funktionsprototyp

I tidigare versioner av C, om en funktion inte tidigare hade deklarerats och dess namn förekom i ett uttryck följt av en vänsterparentes, deklarerades den implicit som en funktion som returnerar en int och inget antogs om dess argument. I detta fall skulle kompilatorn inte kunna utföra kompileringskontroll av argumenttyper och syntaxaritet när funktionen tillämpades på vissa argument. Detta kan orsaka problem. Följande kod illustrerar en situation där beteendet hos en implicit deklarerad funktion är odefinierat.

#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 förväntar sig att ett heltalsargument finns på stacken eller i ett register när den anropas. Om prototypen utelämnas har kompilatorn inget sätt att upprätthålla detta och MyFunction kommer att sluta fungera på något annat datum på stacken (möjligen en returadress eller värdet av en variabel som för tillfället inte är inom räckvidden). Genom att inkludera funktionsprototypen informerar du kompilatorn om att funktionen MyFunction tar ett heltalsargument och du gör det möjligt för kompilatorn att fånga upp den här typen av fel och få kompileringsprocessen att löpa smidigt. Den här funktionen togs bort från C99-standarden, så utelämnande av en funktionsprototyp resulterar i ett kompileringsfel.

Skapa biblioteksgränssnittRedigera

Genom att placera funktionsprototyper i en header-fil kan man specificera ett gränssnitt för ett bibliotek.

KlassdeklarationRedigera

I C++ används funktionsprototyper även i klassdefinitioner.

Lämna ett svar

Din e-postadress kommer inte publiceras.