- Funktionsprototyp
-
Als Funktionsprototyp bezeichnet man in verschiedenen Programmiersprachen (vor allem C und C++) die Deklaration einer Funktion – inklusive Angaben über Anzahl und Typ der Parameter und Typ des Rückgabewertes – getrennt von ihrer Implementierung (Definition). Man spricht auch ungenau von der Vorausdeklaration (englisch: forward declaration, oft falsch als „Vorwärtsdeklaration“ übersetzt) einer Funktion, diese muss aber nicht in jedem Fall einen vollwertigen Funktionsprototypen darstellen. Beispiel:
int funktion();
wäre in C eine gültige Vorausdeklaration, aber kein Prototyp, da keinerlei Angaben über Funktionsparameter gemacht werden. Jede Definition einer Funktion liefert hingegen automatisch immer auch eine Prototypdeklaration für nachfolgenden Programmcode.Inhaltsverzeichnis
Hintergrund
Mit Hilfe von Funktionsprototypen wird dem Compiler die Schnittstelle einer Funktion mitgeteilt, bevor diese verwendet wird. So kann der Compiler bei jedem Aufruf der Funktion überprüfen, ob die Funktionsparameter und der Rückgabewert konsistent verwendet werden. Die vollständige Implementierung einer Funktion kann so zu einem späteren Zeitpunkt oder in einem separaten Programmmodul erfolgen. Dieses Konzept ermöglicht auch den wechselseitigen Aufruf zweier oder mehrerer Funktionen (englisch: mutual recursion) sowie den Einsatz von Single-Pass-Compilern, die den Quelltext eines Programms in einem Durchgang übersetzen. Beim Entwurf von Pascal nutzte Niklaus Wirth solche bereits aus ALGOL bekannten Vorausdeklarationen, um beim damaligen Stand der Compilertechnologie die Implementierung eines Single-Pass-Compilers zu ermöglichen.[1]
Verwendung
Funktionsprototypen können genutzt werden, um anderen Programmierern lediglich die Schnittstelleninformationen zur Verfügung zu stellen und die interne Realisierung verborgen zu halten. In diesem Fall unterstützen Funktionsprototypen das so genannte Geheimnisprinzip. Funktionsprototypen und zugehörige Implementierungen werden dann getrennt gehalten. Entwickler, die keinen Zugriff auf Interna haben sollen, erhalten lediglich die Dateien mit den Funktionsprototypen. In dieser Form wurden Funktionsprototypen etwa in der Sprache Modula-2 eingesetzt. In der Sprache Delphi kann man durch das Eintragen von Prototypen in einem öffentlichen und einem geschützten Teil steuern, ob externe Objekte auf Interna zugreifen dürfen oder nicht. Auch dies dient dem Geheimnisprinzip. Während im ersten Fall eine Möglichkeit zum Verbergen von Interna vorliegt, dient das Konzept im zweiten Fall eher der Unterbindung von Zugriffen auf Interna.
Während z. B. In C++ Funktionsprototypen verwendet werden müssen,[2] ist dies in C nur in bestimmten Fällen zwingend vorgeschrieben (ihre generelle Verwendung zeugt jedoch von gutem Programmierstil und beugt Fehlern beim Funktionsaufruf vor):
- Funktionen der C Standardbibliothek dürfen nicht ohne Prototypen verwendet werden; diese stammen üblicherweise aus per
#include
-Präprozessorbefehl eingebundenen Headern. - Für Funktionen, bei deren Aufruf die automatische Anpassung der Argumente (default argument promotion) zu den entsprechenden Parametern unpassende Datentypen liefern würde, sind Funktionsprototypen ebenfalls verpflichtend.
In diversen Richtlinien wie beispielsweise MISRA-C wird die Angabe von Funktionsprototypen zur semantischen Überprüfung bzw. für Konsistenzprüfungen gefordert.[3] In C99 wird die keinen Funktionsprototyp darstellende einfache Vorausdeklaration einer Funktion bereits als veraltet bezeichnet, was auf eine Entfernung dieser Variante in zukünftigen Versionen der Sprachnorm hinweist.[4]
Beispiel in C
// enthält unter anderem den Funktionsprototyp für printf(): #include <stdio.h> // Prototypdeklaration, die Parameterbezeichner sind optional: double addiere( double zahl1, double zahl2 ); int main( void ) { // Aufruf der Funktion; ohne Funktionsprototyp wären hier // Argumenttyp (int) und Parametertyp (double) inkompatibel: printf( "2+3=%g\n", addiere( 2, 3 ) ); return 0; } // Definition der Funktion: double addiere( double zahl1, double zahl2 ) { return zahl1 + zahl2; }
Einzelnachweise
- ↑ Brian W. Kernighan: Why Pascal is Not My Favorite Programming Language. 1981 (http://www.lysator.liu.se/c/bwk-on-pascal.html, abgerufen am 21. September 2010).
- ↑ Working Draft, Standard for Programming Language C++. Abgerufen am 26. September 2010 (PDF, englisch, nicht-normatives Arbeitsdokument).
- ↑ MISRA C Rules. Abgerufen am 26. September 2010 (PDF, englisch, auf computing.unn.ac.uk).
- ↑ Rationale für C99, Revision 5.10. Abgerufen am 12. September 2010 (PDF, englisch, Abschnitt 6.11.6).
Literatur
- British Standards Institute (Hrsg.): The C Standard - Incorporating TC1 - BS ISO/IEC 9899:1999. John Wiley & Sons, 2003, ISBN 0-470-84573-2.
Kategorien:- Programmiersprachelement
- Programmiersprache C
- Programmiersprache C++
- Funktionen der C Standardbibliothek dürfen nicht ohne Prototypen verwendet werden; diese stammen üblicherweise aus per
Wikimedia Foundation.