Was ist der Unterschied zwischen Funktionsdeklaration und Signatur?

Lesezeit: 6 Minuten

Benutzeravatar von Tim
Tim

Was ist in C oder C++ der Unterschied zwischen Funktionsdeklaration und Funktionssignatur?

Ich weiß etwas über Funktionsdeklaration, aber die Funktionssignatur ist mir völlig neu. Welchen Sinn hat das Konzept der Funktionssignatur? Wofür werden die beiden Konzepte eigentlich verwendet?

Vielen Dank!

  • Formal gibt es so etwas wie “Funktionssignatur” in C nicht. In C gibt es einfach keine Notwendigkeit für das Konzept der “Funktionssignatur”. Ihre Frage ist rein C++. Es ist völlig bedeutungslos in C.

    – AnT steht zu Russland

    8. März 2010 um 16:35 Uhr

  • Dann ist sicherlich eine sinnvolle Antwort in C “none”, oder?

    – John McFarlane

    12. Juni 2021 um 3:46 Uhr

Benutzeravatar von Michael Burr
Michael Burr

Eine Funktionsdeklaration ist der Prototyp für eine Funktion (oder sie kann aus der Funktionsdefinition stammen, wenn der Compiler zu diesem Zeitpunkt noch keinen Prototyp gesehen hat) – sie enthält den Rückgabetyp, den Namen der Funktion und die Typen der Parameter ( optional in C).

Eine Funktionssignatur sind die Teile der Funktionsdeklaration, die der Compiler verwendet, um eine Überladungsauflösung durchzuführen. Da mehrere Funktionen denselben Namen haben können (dh sie sind überladen), braucht der Compiler eine Möglichkeit zu bestimmen, in welche von mehreren möglichen Funktionen mit einem bestimmten Namen ein Funktionsaufruf aufgelöst werden soll. Die Signatur ist das, was der Compiler in dieser Überladungsauflösung berücksichtigt. Insbesondere definiert der Standard „Signatur“ als:

die Informationen über eine Funktion, die an der Überladungsauflösung teilnimmt: die Typen ihrer Parameter und, wenn die Funktion ein Klassenmitglied ist, die cv-Qualifizierer (falls vorhanden) für die Funktion selbst und die Klasse, in der die Mitgliedsfunktion deklariert ist.

Beachten Sie, dass der Rückgabetyp nicht Teil der Funktionssignatur ist. Wie der Standard in einer Fußnote sagt: “Funktionssignaturen enthalten keinen Rückgabetyp, da dieser nicht an der Auflösung von Überladungen beteiligt ist”.

  • Es ist nicht ganz richtig zu sagen, dass “Funktionsdeklaration der Prototyp ist”. In C++ ist es praktisch richtig, aber terminologisch falsch, da es in C++ keinen Begriff wie “Prototyp” gibt. In C ist es streng falsch, weil in C die Funktionsdeklaration nicht unbedingt ein Prototyp ist. Zum Beispiel, void foo(); ist eine Funktionsdeklaration, die keinen Prototyp in C einführt. Eigentlich sollte diese Frage nicht mit C gekennzeichnet werden, da es in C keine Vorstellung von “Funktionssignatur” gibt. Es ist eine reine C++-Frage und aus diesem Grund die Antwort sollte keine “Prototypen” erwähnen.

    – AnT steht zu Russland

    8. März 2010 um 16:33 Uhr

  • Könnten Sie bitte Quellen nennen?

    – Manuel Arwed Schmidt

    3. November 2015 um 16:03 Uhr

  • Sie haben „Signatur“, „Erklärung“, „Prototyp“ und „Definition“ ohne klare Unterscheidung eingeführt. Könnten Sie dies bearbeiten, um jeweils ein konkretes Beispiel hinzuzufügen?

    – Andy Ray

    1. Juli 2021 um 20:44 Uhr

Benutzeravatar von dirkgently
dirkly

Die Norm definiert zwei Begriffe: Deklaration und Definition. Eine Definition ist eine vorläufige Erklärung. Die Standards C99 und C++03 haben jedoch leicht unterschiedliche Definitionen.

Aus dem C++0x-Entwurf:

Anhang C

8.3.5 Änderung: In C++ akzeptiert eine mit einer leeren Parameterliste deklarierte Funktion keine Argumente. In C bedeutet eine leere Parameterliste, dass Anzahl und Typ der Funktionsargumente unbekannt sind.

Definitionen

1.3.11 Unterschrift

der Name und die Parametertypliste (8.3.5) einer Funktion sowie die Klasse, das Konzept, die Konzeptkarte oder der Namensraum, von denen sie ein Mitglied ist. Wenn eine Funktion oder Funktionsvorlage ein Klassenmitglied ist, enthält ihre Signatur zusätzlich die CV-Qualifizierer (falls vorhanden) und die Ref-Qualifizierer (falls vorhanden) auf der Funktion oder Funktionsschablone selbst. Die Unterschrift eines eingeschränkten Mitglieds (9.2) enthält seine Vorlagenanforderungen. Die Signatur einer Funktionsvorlage enthält zusätzlich ihren Rückgabetyp, ihre Vorlagenparameterliste und ihre Vorlagenanforderungen (falls vorhanden). Die Signatur einer Funktionsvorlagenspezialisierung umfasst die Signatur der Vorlage, deren Spezialisierung sie ist, und ihre Vorlagenargumente (ob explizit angegeben oder abgeleitet). [
Note: Signatures are used as a basis
for name mangling and linking.—end
note ]

  • Danke, aber ich kann schwer verstehen, was Sie sagen wollen.

    – Tim

    24. Februar 2010 um 0:16 Uhr

  • Ich kenne die Funktionsdeklaration, aber die Funktionssignatur ist mir völlig neu. Welchen Sinn hat das Konzept der Funktionssignatur? Wofür werden die beiden Konzepte eigentlich verwendet?

    – Tim

    24. Februar 2010 um 0:22 Uhr

  • @Tim: 1) Der C-Standard definiert den Begriff Signatur nicht. Es wird in der allgemeinen Programmierliteratur lose verwendet und ist oft gleichbedeutend mit einer Funktionsdeklaration. Beachten Sie, dass Funktionsdeklarationen keine Parameter haben müssen. Definitionen jedoch, wenn Sie sie in der Definition verwenden. 2) Signaturen werden häufig vom Compiler verwendet, um zB eine Definition für einen Bezeichner bereitzustellen und im Fall von C++ die beste Überladung auszuwählen.

    – dirkgent

    24. Februar 2010 um 0:26 Uhr

Benutzeravatar von Mark Ransom
Mark Lösegeld

Die Funktionssignatur enthält nicht den Rückgabetyp oder Verknüpfungstyp der Funktion.

OK, Wikipedia stimmt mir nicht zu, dass der Rückgabetyp enthalten ist. Ich weiß jedoch, dass der Rückgabetyp vom Compiler nicht verwendet wird, wenn entschieden wird, ob ein Funktionsaufruf mit der Signatur übereinstimmt. Diese vorherige StackOverflow-Frage scheint zuzustimmen: Ist der Rückgabetyp Teil der Funktionssignatur?

  • Bedeutet “Speicherklasse” die Klasse, zu der die Funktion gehört? Welchen Sinn hat das Konzept der Funktionssignatur? Vielen Dank!

    – Tim

    24. Februar 2010 um 0:10 Uhr

  • @Tim: Nein. Sie beziehen sich auf die anwendbare Verknüpfung.

    – dirkgent

    24. Februar 2010 um 0:15 Uhr

  • Ich würde dem Wikipedia-Artikel jetzt nicht allzu viel Glauben schenken. Es ist nicht gut geschrieben. Das Methodensignatur Artikel ist etwas besser.

    – Rob Kennedy

    24. Februar 2010 um 0:16 Uhr

  • Ich vermute, dass ich meine Terminologie verwirre – Speicherklasse bezieht sich auf Variablen, nicht auf Funktionen. Was ich meinte, sind die Eigenschaften, die zum Beispiel durch die Schlüsselwörter static oder extern impliziert werden. Ich habe meine Antwort aktualisiert.

    – Markieren Sie Lösegeld

    24. Februar 2010 um 0:16 Uhr


  • @Mark Ransom: static und extern sind Speicherklassen, die kann gelten für Funktionen in C und C++.

    – dirkgent

    24. Februar 2010 um 0:24 Uhr

Bitte beachten Sie auch, dass das Top-Level-const und volatile on-Argument laut Standard nicht Teil der Signatur sind. Aber einige Compiler machen das falsch.

z.B

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

hat die gleiche Signatur wie

void f(int, const char*);

Benutzeravatar von t0mm13b
t0mm13b

Eine Funktionsdeklaration ist ein Prototyp. Eine Funktionssignatur gibt den Rückgabetyp und die verwendeten Parameter an, aus denen die Signatur besteht. Bedenken Sie:

int foo(int, int);  /* Function Declaration */


/* Implementation of foo 
** Function signature
*/
int foo(int a, int b){
}

Betrachten Sie nun dieses Szenario: Ein Programmierer wird gefragt, wofür die Funktionssignatur ist foo:

  • Es gibt einen Datentyp von zurück int
  • Zwei Parameter sind ebenfalls vom Datentyp intgenannt a und b beziehungsweise

Der Funktionsprototyp hingegen soll im C/C++-Compiler darauf hinweisen, was zu erwarten ist, und wenn die Signatur nicht mit dem Prototyp übereinstimmt, gibt der Compiler einen Fehler aus, zusammen mit dem Kontext „Funktionsdeklarationsfehler“ oder „Prototyp-Fehlanpassung“.

  • Vielen Dank! Die Funktionssignatur ist also der Teil der Funktionsdefinition, der der Funktionsdeklaration entspricht?

    – Tim

    24. Februar 2010 um 0:40 Uhr

  • @ Tim: Ja. Exakt. 🙂 Hoffe, das macht Sinn für Sie?

    – t0mm13b

    24. Februar 2010 um 0:44 Uhr

  • In C darf eine Funktionsdeklaration kein Prototyp sein: int f(); ist ein Beispiel.

    – Alok Singhal

    24. Februar 2010 um 1:27 Uhr

  • Vielen Dank! Die Funktionssignatur ist also der Teil der Funktionsdefinition, der der Funktionsdeklaration entspricht?

    – Tim

    24. Februar 2010 um 0:40 Uhr

  • @ Tim: Ja. Exakt. 🙂 Hoffe, das macht Sinn für Sie?

    – t0mm13b

    24. Februar 2010 um 0:44 Uhr

  • In C darf eine Funktionsdeklaration kein Prototyp sein: int f(); ist ein Beispiel.

    – Alok Singhal

    24. Februar 2010 um 1:27 Uhr

1407900cookie-checkWas ist der Unterschied zwischen Funktionsdeklaration und Signatur?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy