Dans les versions antérieures du C, si une fonction n’était pas préalablement déclarée et que son nom apparaissait dans une expression suivie d’une parenthèse gauche, elle était implicitement déclarée comme une fonction qui renvoie un int
et rien n’était supposé sur ses arguments. Dans ce cas, le compilateur ne serait pas en mesure d’effectuer une vérification à la compilation des types d’arguments et de l’arité syntaxique lorsque la fonction est appliquée à certains arguments. Cela peut poser des problèmes. Le code suivant illustre une situation dans laquelle le comportement d’une fonction implicitement déclarée est indéfini.
#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); }}
La fonction MaFonction attend qu’un argument entier soit sur la pile ou dans un registre lorsqu’elle est appelée. Si le prototype est omis, le compilateur n’aura aucun moyen de le faire respecter et MaFonction finira par opérer sur une autre donnée de la pile (éventuellement une adresse de retour ou la valeur d’une variable qui n’est pas actuellement dans la portée). En incluant le prototype de fonction, vous informez le compilateur que la fonction MaFonction prend un argument entier et vous permettez au compilateur d’attraper ce genre d’erreurs et de faire en sorte que le processus de compilation se déroule sans problème. Cette fonctionnalité a été supprimée de la norme C99, donc l’omission d’un prototype de fonction entraînera une erreur de compilation.
Création d’interfaces de bibliothèqueEdit
En plaçant des prototypes de fonction dans un fichier d’en-tête, on peut spécifier une interface pour une bibliothèque.
Déclaration de classeEdit
En C++, les prototypes de fonction sont également utilisés dans les définitions de classe.