Wenn in früheren Versionen von C eine Funktion nicht vorher deklariert wurde und ihr Name in einem Ausdruck, gefolgt von einer linken Klammer, vorkam, wurde sie implizit als eine Funktion deklariert, die einen int
zurückgibt, und es wurde nichts über ihre Argumente angenommen. In diesem Fall wäre der Compiler nicht in der Lage, zur Kompilierzeit eine Überprüfung der Argumenttypen und der Syntaxarität durchzuführen, wenn die Funktion auf einige Argumente angewendet wird. Dies kann zu Problemen führen. Der folgende Code veranschaulicht eine Situation, in der das Verhalten einer implizit deklarierten Funktion undefiniert ist.
#include <stdio.h>/* If this prototype is provided, the compiler will catch the error in * |main|. If it is omitted, then the error may go unnoticed. */int MyFunction(int n); /* Prototype */int main( void ) /* Calling function */{ printf("%d\n", MyFunction()); /* Error: forgot argument to MyFunction */ return 0;}int MyFunction( int n ) /* Called function definition */{ if (n == 0) { return 1; } else { return n * MyFunction(n - 1); }}
Die Funktion MyFunction erwartet, dass ein Integer-Argument auf dem Stack oder in einem Register liegt, wenn sie aufgerufen wird. Wenn der Prototyp weggelassen wird, hat der Compiler keine Möglichkeit, dies zu erzwingen, und MyFunction wird mit einem anderen Datum auf dem Stack arbeiten (möglicherweise eine Rücksprungadresse oder der Wert einer Variablen, die derzeit nicht im Anwendungsbereich ist). Durch Einfügen des Funktionsprototyps teilen Sie dem Compiler mit, dass die Funktion MyFunction ein Integer-Argument annimmt, und Sie ermöglichen es dem Compiler, diese Art von Fehlern abzufangen und den Kompilierungsprozess reibungslos ablaufen zu lassen. Diese Funktion wurde aus dem C99-Standard entfernt, so dass das Weglassen eines Funktionsprototyps zu einem Kompilierungsfehler führt.
Erstellen von BibliotheksschnittstellenBearbeiten
Indem man Funktionsprototypen in einer Header-Datei platziert, kann man eine Schnittstelle für eine Bibliothek angeben.
KlassendeklarationBearbeiten
In C++ werden Funktionsprototypen auch in Klassendefinitionen verwendet.