U hoeft niet de hele hoofdtekst van een functie te zien om te weten hoe u deze moet aanroepen. Je hebt alleen een belofte nodig. Die belofte is het functieprototype.
In modern C is het niet onderhandelbaar om prototypes vooraf te declareren. Het vertelt de compiler precies wat een functie verwacht: de naam, de argumenttypen en de retourwaarde. Zonder dat vlieg je blind. En in C is blindheid duur.
De verborgen kosten van ontbrekende prototypes
Denk eens aan dit fragment. Het ziet er onschuldig uit. Het compileert. Het loopt.
Hier heeft add duidelijk twee gehele getallen nodig. Maar de oproep passeert slechts één. Een strikte compiler zou moeten schreeuwen. Velen niet. Ze gaan er standaard van uit dat het retourtype int is en negeren de parametermismatch volledig.
Het resultaat? Verkeerde antwoorden. Stille corruptie. Je bent uren bezig met het jagen op een insect dat je in het gezicht staarde op regel twee.
Dit gebeurt omdat verouderd C-gedrag ervoor zorgt dat niet-geprototypeerde functies standaard ‘int’ retourneren. Als de feitelijke functie ‘float’ retourneert, interpreteert de compiler de bits verkeerd. Het prototype lost dit op. Het dwingt het contract af.
Het contract afdwingen
Zet het prototype bovenaan. Ergens vóór het eerste gesprek.
Nu markeert de compiler de fout. Het weet dat ‘add’ twee argumenten vereist. Het weigert de niet-overeenkomende oproep samen te stellen. U bespaart uren aan foutopsporing.
Oude stijl versus moderne C
Niet-ANSI-compilers zijn een ander beest. Ze laten prototypes toe, maar met een addertje onder het gras. De parameterlijst moet leeg zijn.
Dit vertelt de compiler de naam en het retourneringstype. Over argumenten zegt het niets. Er vindt geen foutcontrole plaats. Je bent terug bij af.
Moderne C (ANSI-standaard) vereist expliciete typen in het prototype. Dit elimineert onduidelijkheid. Het vangt type-mismatches op. Het vangt ontbrekende argumenten op. Het vangt alles op.
Praktische stappen
- Refactor-bellen sorteren. Verplaats de logica naar een functie. Declareer een prototype. Geef de array en de grootte expliciet door.
- Isoleer invoer. Maak een speciale functie voor gebruikersinvoer. Maak de ‘hoofd’ niet rommelig. Maak er een prototype van. Test het.
Dit gaat niet over stijlpunten. Het gaat om correctheid.
Een prototype is een door de compiler afgedwongen contract. Breek het en de build mislukt.
U vraagt zich misschien af waarom dit ertoe doet als uw code wordt uitgevoerd. Het is van belang omdat runtime-fouten moeilijker te herstellen zijn dan compile-time-fouten. Een compileerfout houdt u tegen. Een runtimefout verbergt zich in de productie.
Het verschil tussen een robuust programma en een kwetsbaar programma komt vaak neer op deze paar regels bovenaan. Sla ze niet over.
De compiler is er om te helpen. Luister ernaar.















