web-dev-qa-db-fra.com

Qu'est-ce qu'un paramètre formel?

Lors de la compilation en C++, je me retrouve souvent avec des messages d'erreur traitant des "paramètres formels", tels que

error C2719: 'b': formal parameter with __declspec(align('16')) won't be aligned

Je comprends l'erreur et le fait que b est un paramètre d'une fonction que je définis.

Cependant, qu'est-ce que cela signifie qu'un paramètre est formel? Peut-il y avoir aussi des paramètres informels?

Je remarque que le terme "paramètre formel" apparaît également dans d'autres langues, donc je suppose que c'est un terme plus générique qui n'est pas nécessairement spécifique à la famille C des langues? Les paramètres informels sont-ils pris en charge par un sous-ensemble de langues?


Après avoir vu les réponses, une dernière question: d'où viennent ces noms paramètre formel et paramètre réel? Provient-il de la norme C, ou est-ce un effet de l'appeler comme tel dans certains calculs de langage abstrait?

23
CygnusX1

Il existe des paramètres formel et réel:

void foo(int arg); //arg is a formal parameter

int main()
{
    int val = 1;
    foo(val);  //val is an actual parameter
}

De C++ Standard :

1.3.1 paramètre formel (paramètre)

un objet ou une référence déclaré dans le cadre d'une déclaration ou d'une définition de fonction, ou dans la clause catch d'un gestionnaire d'exceptions, qui acquiert une valeur à l'entrée de la fonction ou du gestionnaire; un identifiant de la liste séparée par des virgules délimité par les parenthèses suivant immédiatement le nom de la macro dans une définition de macro de type fonction; ou un paramètre de modèle. Les paramètres sont également appelés arguments formels ou paramètres formels.

1.3.10 paramètre réel (argument)

une expression dans la liste séparée par des virgules délimitée par les parenthèses dans une expression d'appel de fonction, une séquence de jetons de prétraitement dans la liste séparée par des virgules délimitée par les parenthèses dans une invocation de macro de type fonction, l'opérande de throw ou une expression, type-id ou template-name dans la liste séparée par des virgules délimitée par les crochets dans une instanciation de modèle. Également appelé argument réel ou paramètre réel.

31
cpp

Les paramètres formels sont les paramètres connus lors de la définition de la fonction. Les paramètres réels sont ce que vous en fait (d'où le nom) passez à la fonction lorsque vous l'appelez.

void foo( int a ); // a is a formal parameter

foo(10); // 10 is the actual parameter
15
SingerOfTheFall

C'est une question d'être un peu pédant sur la terminologie, mais assez utile: les paramètres formels sont ce que vous pensez des paramètres de fonction:

int foo(bool a, float b);

Ici a et b sont des paramètres formels. Le fait est que dans le corps de la fonction, vous faites référence à ces paramètres "formellement" sans vraiment connaître leur valeur. Ce n'est que lorsque vous effectuez évaluer une expression d'appel de fonction que les paramètres de fonction formels sont liés aux arguments d'appel de fonction:

int result = foo(false, 1.5);

Dans cette expression d'appel, la valeur false du premier argument est liée au paramètre formel a, et de même pour le deuxième argument.

La distinction entre les paramètres et les arguments est peut-être plus importante pour les concepteurs de langage et les rédacteurs de comilateurs, mais à titre d'exemple en C++, il peut être très utile de se familiariser avec cela lorsque vous essayez de suivre les règles de déduction des arguments de modèle.

9
Kerrek SB