Appels de fonctions et conversion d'arguments
Remonter à Fonctions - Index
Une fonction est appelée avec certains arguments réels placés dans la même séquence que leurs paramètres formels. Les arguments réels sont convertis comme s'il s'agissait d'une initialisation aux types déclarés pour les paramètres formels.
Voici un résumé des règles qui déterminent la façon dont le compilateur traite les modificateurs de langage et les paramètres formels dans les appels de fonction, avec et sans prototypes :
- Les modificateurs de langage pour une définition de fonction doivent correspondre à ceux utilisés dans la déclaration de la fonction au niveau de tous les appels la concernant.
- Une fonction peut modifier la valeur de ses paramètres formels, mais ceci n'a aucun effet sur les arguments réels dans la routine appelante, sauf pour les arguments références en C++.
Lorsqu'un prototype de fonction n'a pas été préalablement déclaré, le compilateur convertit les arguments entiers de l'appel d'une fonction selon les règles ordinaires de conversion des valeurs entières décrites dans Conversions arithmétiques standard. Lorsqu'un prototype de fonction est accessible, le compilateur convertit chaque argument dans le type du paramètre déclaré comme s'il s'agissait d'une affectation.
Lorsqu'un prototype de fonction contient des points de suspension (...), le compilateur convertit les arguments donnés jusqu'aux points de suspension comme pour tout autre prototype. Le compilateur convertit ensuite les arguments qui suivent les paramètres fixes, selon les règles normales applicables aux arguments des fonctions sans prototype.
S'il existe un prototype, les nombres d'arguments du prototype et de l'appel de la fonction doivent être les mêmes (sauf présence de points de suspension dans le prototype). Les types doivent simplement être compatibles puisqu'une affectation peut légalement les convertir. Vous pouvez toujours utiliser une conversion explicite des types pour transformer un argument et lui donner un type acceptable pour le prototype.
Remarque : Si votre prototype de fonction ne correspond pas à la définition réelle de la fonction, le compilateur le détecte si, et uniquement si, cette définition figure dans la même unité de compilation que le prototype. Si vous créez une bibliothèque de routines avec un fichier en-tête pour les prototypes, prévoyez d'inclure celui-ci au moment de la compilation de la bibliothèque, afin que les éventuelles contradictions entre les prototypes et les définitions réelles soient détectées. C++ offre une connexion sûre, de sorte que les différences entre les paramètres prévus et réels seront mises en lumière par le lieur.