web-dev-qa-db-fra.com

Quelle est la différence entre la déclaration de fonction et la signature?

En C ou C++ quelle est la différence entre la déclaration de fonction et la signature de fonction?

Je connais quelque chose de déclaration de fonction mais la signature de fonction est totalement nouvelle pour moi. Quel est l'intérêt d'avoir le concept de signature de fonction? À quoi servent réellement les deux concepts?

Merci!

40
Tim

Une déclaration de fonction est le prototype d'une fonction (ou elle peut provenir de la définition de la fonction si aucun prototype n'a été vu par le compilateur à ce stade) - elle comprend le type de retour, le nom de la fonction et les types des paramètres ( éventuellement en C).

Une signature de fonction est les parties de la déclaration de fonction que le compilateur utilise pour effectuer une résolution de surcharge. Étant donné que plusieurs fonctions peuvent avoir le même nom (c'est-à-dire qu'elles sont surchargées), le compilateur a besoin d'un moyen de déterminer à laquelle de plusieurs fonctions possibles avec un nom particulier un appel de fonction doit se résoudre. La signature est ce que le compilateur considère dans cette résolution de surcharge. Plus précisément, la norme définit la "signature" comme:

les informations sur une fonction qui participe à la résolution de surcharge: les types de ses paramètres et, si la fonction est un membre de classe, les cv-qualifiers (le cas échéant) sur la fonction elle-même et la classe dans laquelle la fonction membre est déclarée.

Notez que le type de retour ne fait pas partie de la signature de fonction. Comme le dit la norme dans une note de bas de page, "Les signatures de fonction n'incluent pas le type de retour, car cela ne participe pas à la résolution de surcharge".

43
Michael Burr

La norme définit deux termes: déclaration et définition. Une définition est une déclaration provisoire. Cependant, les normes C99 et C++ 03 ont des définitions légèrement différentes.

Du brouillon C++ 0x:

Annexe C

8.3.5 Changement: En C++, une fonction déclarée avec une liste de paramètres vide ne prend aucun argument. En C, une liste de paramètres vide signifie que le nombre et le type des arguments de la fonction sont inconnus "

Définitions

signature 1.3.11

le nom et la liste des types de paramètres (8.3.5) d'une fonction, ainsi que la classe, le concept, la carte conceptuelle ou l'espace de noms dont elle est membre. Si une fonction ou un modèle de fonction est un membre de classe, sa signature inclut en outre les qualificateurs cv (le cas échéant) et le qualificatif ref (le cas échéant) sur la fonction ou le modèle de fonction lui-même. La signature d'un membre contraint (9.2) inclut ses exigences de modèle. La signature d'un modèle de fonction inclut en outre son type de retour, sa liste de paramètres de modèle et ses exigences de modèle (le cas échéant). La signature d'une spécialisation de modèle de fonction comprend la signature du modèle dont elle est une spécialisation et ses arguments de modèle (qu'ils soient explicitement spécifiés ou déduits). [Remarque: les signatures sont utilisées comme base pour le changement de nom et la liaison. - note de fin]

6
dirkgently

La signature de la fonction n'inclut pas le type de retour ou le type de liaison de la fonction.

OK, Wikipedia n'est pas d'accord avec moi sur le type de retour inclus. Cependant, je sais que le type de retour n'est pas utilisé par le compilateur lorsqu'il décide si un appel de fonction correspond à la signature. Cette précédente question StackOverflow semble être d'accord: Le type de retour fait-il partie de la signature de la fonction?

3
Mark Ransom

Veuillez également noter que const de haut niveau et volatile sur argument ne font pas partie de la signature, selon la norme. Mais certains compilateurs se trompent.

par exemple.

void f(const int, const char* const);

a la même signature que

void f(int, const char*);
1
Ben Voigt