Programmer en langage C
102
© Éditions Eyrolles
La déclaration complète d’une fonction porte le nom de prototype. Il est possible, dans un
prototype, de faire figurer des noms d’arguments, lesquels sont alors totalement arbitraires ;
cette possibilité a pour seul intérêt de pouvoir écrire des prototypes qui sont identiques à l’entête de la fonction (au point-virgule près), ce qui peut en faciliter la création automatique.
Dans notre exemple du paragraphe 2, notre fonction fexple aurait pu être déclarée ainsi :
float fexple (float x, int b, int c) ;
4.2 Où placer la déclaration d’une fonction
La tendance la plus naturelle consiste à placer la déclaration d’une fonction à l’intérieur des
déclarations de toute fonction l’utilisant ; c’est ce que nous avons fait jusqu’ici. Et, de surcroît,
dans tous nos exemples précédents, la fonction utilisatrice était la fonction main elle-même !
Dans ces conditions, nous avions affaire à une déclaration locale dont la portée était limitée à
la fonction où elle apparaissait.
Mais il est également possible d’utiliser des déclarations globales, en les faisant apparaître
avant la définition de la première fonction. Par exemple, avec :
float fexple (float, int, int) ;
main()
{ .....
}
void f1 (...)
{ .....
}
la déclaration de fexple est connue à la fois de main et de f1.
4.3 À quoi sert la déclaration d’une fonction
Nous avons vu que la déclaration d’une fonction est plus ou moins obligatoire et qu’elle peut
être plus ou moins détaillée. Malgré tout, nous vous avons recommandé d’employer toujours
la forme la plus complète possible qu’on nomme prototype. Dans ce cas, un tel prototype peut
être utilisé par le compilateur, et cela de deux façons complètement différentes.
a) Si la définition de la fonction se trouve dans le même fichier source (que ce soit avant ou
après la déclaration), il s’assure que les arguments muets ont bien le type défini dans le prototype. Dans le cas contraire, il signale une erreur.
b) Lorsqu’il rencontre un appel de la fonction, il met en place d’éventuelles conversions des
valeurs des arguments effectifs dans le type indiqué dans le prototype. Par exemple, avec notre
fonction fexple du paragraphe 2, un appel tel que :
fexple (n+1, 2*x, p)
Delannoy Livre.book Page 102 Mercredi, 6. mai 2009 4:26 16
102
© Éditions Eyrolles
La déclaration complète d’une fonction porte le nom de prototype. Il est possible, dans un
prototype, de faire figurer des noms d’arguments, lesquels sont alors totalement arbitraires ;
cette possibilité a pour seul intérêt de pouvoir écrire des prototypes qui sont identiques à l’entête de la fonction (au point-virgule près), ce qui peut en faciliter la création automatique.
Dans notre exemple du paragraphe 2, notre fonction fexple aurait pu être déclarée ainsi :
float fexple (float x, int b, int c) ;
4.2 Où placer la déclaration d’une fonction
La tendance la plus naturelle consiste à placer la déclaration d’une fonction à l’intérieur des
déclarations de toute fonction l’utilisant ; c’est ce que nous avons fait jusqu’ici. Et, de surcroît,
dans tous nos exemples précédents, la fonction utilisatrice était la fonction main elle-même !
Dans ces conditions, nous avions affaire à une déclaration locale dont la portée était limitée à
la fonction où elle apparaissait.
Mais il est également possible d’utiliser des déclarations globales, en les faisant apparaître
avant la définition de la première fonction. Par exemple, avec :
float fexple (float, int, int) ;
main()
{ .....
}
void f1 (...)
{ .....
}
la déclaration de fexple est connue à la fois de main et de f1.
4.3 À quoi sert la déclaration d’une fonction
Nous avons vu que la déclaration d’une fonction est plus ou moins obligatoire et qu’elle peut
être plus ou moins détaillée. Malgré tout, nous vous avons recommandé d’employer toujours
la forme la plus complète possible qu’on nomme prototype. Dans ce cas, un tel prototype peut
être utilisé par le compilateur, et cela de deux façons complètement différentes.
a) Si la définition de la fonction se trouve dans le même fichier source (que ce soit avant ou
après la déclaration), il s’assure que les arguments muets ont bien le type défini dans le prototype. Dans le cas contraire, il signale une erreur.
b) Lorsqu’il rencontre un appel de la fonction, il met en place d’éventuelles conversions des
valeurs des arguments effectifs dans le type indiqué dans le prototype. Par exemple, avec notre
fonction fexple du paragraphe 2, un appel tel que :
fexple (n+1, 2*x, p)
Delannoy Livre.book Page 102 Mercredi, 6. mai 2009 4:26 16
