Terminologie: Forward-Deklaration versus Funktionsprototyp

Lesezeit: 3 Minuten

Für mich sind diese Begriffe im Wesentlichen gleichbedeutend mit der Programmiersprache C. In der Praxis bevorzuge ich möglicherweise die “Vorwärtsdeklaration” für In-File-Prototypen gegenüber dem “Funktionsprototyp” für Prototypen, die über eine Header-Datei enthalten sind. Aber selbst das ist eine künstliche Unterscheidung, wenn man bedenkt, was nach der Vorverarbeitung passiert. Vielleicht übersehe ich etwas.

Gibt es einen Konsens darüber, wann ein Begriff gegenüber dem anderen verwendet werden soll?

Benutzer-Avatar
Johannes Bode

Der Begriff “Prototyp” bezieht sich auf eine bestimmte Deklarationssyntax; insbesondere, dass die Anzahl und Typen der Parameter für die Funktion in der Deklaration erscheinen. Gegeben eine Funktion Definition von

int foo(int a, char *b) {...}

Sie können Folgendes haben Erklärungen:

int foo();                // a declaration, but not a prototype
int foo(a, b);            // a declaration, but not a prototype
int foo(int, char *);     // a declaration and a prototype
int foo(int a, char *b);  // a declaration and a prototype

  • Ihre Wahl int foo(a, b); gilt nur wenn a und b bekannte Typnamen sind oder wenn darauf der Funktionsrumpf folgt { … } statt Semikolon.

    – Jonathan Leffler

    10. Mai 2016 um 19:09 Uhr

IMO sind das nicht wirklich Synonyme. Für mich bezieht sich “Funktionsprototyp” auf den Funktionsnamen und die Typen seiner Parameter und Rückgaben. Es gilt nicht nur für das, was Sie “Forward Declaration” nennen. Alle Funktionen haben einen Prototyp.

Wir machen häufiger einen Unterschied zwischen einer Funktion Erklärung und seine entsprechende Definition.

  • +1, obwohl es wirklich üblich ist, das Wort “Prototyp” zu verwenden, um sich auf die Deklaration zu beziehen.

    – Matteo Italien

    13. Dezember 2011 um 22:19 Uhr


  • Ich denke, Sie und @MatteoItalia haben es auf den Punkt gebracht. Ich habe den Begriff Prototyp verwendet, wenn ich den Begriff Deklaration verwenden sollte.

    – Andrew Cottrell

    29. Dezember 2011 um 20:24 Uhr

Benutzer-Avatar
Fred Fu

Ich verwende den Begriff Vorwärtsdeklaration für die folgende Art von struct Deklaration mit Definition.

struct Foo;

Eine Funktionsdeklaration muss aus Gründen der Kompatibilität mit C vor 1989 (K&R) kein vollständiger Prototyp sein.

char *foo();  // NOT the same as char *foo(void)

Das einzige mir bekannte Konzept in C ist die Unterscheidung zwischen Deklaration und Definition. Ein Prototyp ist eine Deklaration und kann überall und jederzeit stattfinden und die Definition, die die tatsächliche Implementierung des gegebenen Objekts ist. Nach diesem Konzept gibt es keine so genannte Vorwärtsdeklaration, es gibt nur eine Deklarationsreihenfolge.

Ich weiß nicht, ob es einen Konsens gibt, aber ich denke, der sauberste Weg wäre:

  • Platzieren Sie alle Deklarationen in Header-Dateien, niemals in Quell- oder .c-Dateien. (Ich denke, Sie meinen Deklaration, wenn Sie Vorwärtsdeklaration sagen.)
  • Platzieren Sie alle Definitionen in Quelldateien

Ich mag es nicht, Deklarationen in Dateien zu platzieren, weil Sie widersprüchliche Deklarationen ohne Fehler in C haben können, was Segfaults verursachen kann, zum Beispiel: if ac hat

int foo(char *str_one, char *str_two, char *str_three);

und bc hat

int foo(char *str_one, char *str_two);

Sie erhalten weder Warnungen noch Fehler, und Aufrufe von bc an foo() platzieren nicht alle Parameter auf dem Stack, wo sie sein sollten, was bedeutet, dass foo() einfach etwas vom Stack holt und es als str_three behandelt, möglicherweise führend zu einem Segfault. Für mich gehen Deklarationen also in Header-Dateien und Definitionen in Quelldateien.

  • Erklärungen für static Funktionen sollten in die C-Datei eingefügt werden, in der sie imho definiert sind, vorzugsweise am Anfang.

    – Patrick Schlüter

    14. Dezember 2011 um 6:37 Uhr

  • @tristopia – guter Punkt, ich habe nicht an statische Funktionen gedacht, als ich dort auf meine Seifenkiste stieg. Ich würde diese definitiv nicht in einer Header-Datei deklarieren.

    – dbeer

    14. Dezember 2011 um 15:36 Uhr

  • Erklärungen für static Funktionen sollten in die C-Datei eingefügt werden, in der sie imho definiert sind, vorzugsweise am Anfang.

    – Patrick Schlüter

    14. Dezember 2011 um 6:37 Uhr

  • @tristopia – guter Punkt, ich habe nicht an statische Funktionen gedacht, als ich dort auf meine Seifenkiste stieg. Ich würde diese definitiv nicht in einer Header-Datei deklarieren.

    – dbeer

    14. Dezember 2011 um 15:36 Uhr

1115700cookie-checkTerminologie: Forward-Deklaration versus Funktionsprototyp

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

Privacy policy