# Prototype de fonction

Dans différents langages de programmation (surtout C et C++), on appelle prototype de fonction ou en-tête de fonction la déclaration d'une fonction - y compris les indications sur le nombre et le type des paramètres et le type de la valeur de retour - séparément de son implémentation. On parle aussi, de manière impropre, de déclaration anticipée. (en anglais : forward declaration, souvent mal traduit par « déclaration en avant ») d'une fonction, mais celle-ci ne doit pas nécessairement représenter un prototype de fonction à part entière dans tous les cas. Exemple : int fonction; serait une déclaration anticipée valable en C, mais pas un prototype, car aucune indication n'est donnée sur les paramètres de la fonction. En revanche, chaque définition de fonction fournit automatiquement une déclaration prototype pour le code de programme suivant.

## Contexte

Les prototypes de fonction permettent de communiquer au compilateur l'interface d'une fonction avant que celle-ci ne soit utilisée. Le compilateur peut ainsi vérifier à chaque appel de la fonction si les paramètres de la fonction et la valeur de retour sont utilisés de manière cohérente. L'implémentation complète d'une fonction peut ainsi être effectuée ultérieurement ou dans un module de programme séparé. Ce concept permet également l'appel réciproque de deux ou plusieurs fonctions (en anglais : mutual recursion) ainsi que l'utilisation de compilateurs à passage unique, qui traduisent le code source d'un programme en une seule fois. Lors de la conception de Pascal, Niklaus Wirth a utilisé de telles déclarations préalables, déjà connues dans Algol, afin de permettre l'implémentation d'un compilateur à passage unique dans l'état actuel de la technologie des compilateurs.

## Utilisation

Les prototypes de fonctions peuvent être utilisés pour fournir uniquement des informations sur l'interface et garder la réalisation interne cachée. Dans ce cas, les prototypes de fonctions soutiennent l'encapsulation. Les prototypes de fonctions et les implémentations correspondantes sont alors conservés séparément. Seuls les fichiers contenant les prototypes de fonctions sont publiés. Les prototypes de fonctions ont été utilisés sous cette forme dans le langage Modula-2. Dans le langage Pascal Objet, il est possible de contrôler si les objets externes ont accès ou non aux données internes en inscrivant les prototypes dans une partie publique et une partie protégée. Cela sert également l'encapsulation. Alors que dans le premier cas, il existe une possibilité de cacher des interna, dans le deuxième cas, le concept sert plutôt à empêcher l'accès aux interna.
Alors qu'en C++, par exemple, il faut utiliser des prototypes de fonctions cela n'est obligatoire en C que dans certains cas :
* Les fonctions de la bibliothèque standard du C ne doivent pas être utilisées sans prototype.
* Les prototypes de fonctions sont également obligatoires pour les fonctions dont l'adaptation automatique des arguments (default argument promotion) aux paramètres correspondants renverrait des types de données inappropriés.
Diverses directives, par exemple MISRA C, exigent l'utilisation de prototypes fonctionnels pour le contrôle de cohérence. Dans C99, la simple déclaration anticipée d'une fonction, qui ne constitue pas un prototype de fonction, est déjà qualifiée d'obsolète, ce qui indique que cette variante sera supprimée dans les futures versions de la norme linguistique.