Functie-prototype

In vroegere versies van C werd een functie die niet eerder was gedeclareerd en waarvan de naam voorkwam in een uitdrukking gevolgd door een haakje links, impliciet gedeclareerd als een functie die een int teruggeeft en er werd niets verondersteld over de argumenten. In dit geval zou de compiler niet in staat zijn om compile-time controle van argument types en Syntax arity uit te voeren wanneer de functie werd toegepast op sommige argumenten. Dit kan problemen veroorzaken. De volgende code illustreert een situatie waarin het gedrag van een impliciet gedeclareerde functie ongedefinieerd is.

#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); }}

De functie MyFunction verwacht dat een integer-argument op de stack of in een register staat wanneer deze wordt aangeroepen. Als het prototype wordt weggelaten, heeft de compiler geen manier om dit af te dwingen en zal MyFunction uiteindelijk op een ander gegeven in de stack werken (mogelijk een retouradres of de waarde van een variabele die momenteel niet in scope is). Door het functie-prototype op te nemen, informeert u de compiler dat de functie MyFunction één integer argument neemt en stelt u de compiler in staat om dit soort fouten op te vangen en het compilatieproces vlot te laten verlopen. Deze functie is verwijderd uit de C99 standaard, dus het weglaten van een functie-prototype zal resulteren in een compileerfout.

Creëren van bibliotheek-interfacesEdit

Door functie-prototypes in een header-bestand te plaatsen, kan men een interface voor een bibliotheek specificeren.

Klasse-declaratieEdit

In C++, worden functie-prototypes ook gebruikt in klasse-definities.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.