pow(x,y)
und
strcmp(s1,s2)
in § 3.6.
<speicherklasse> <typ> <funktions_name> (parameter_liste) { <vereinbarungen> <anweisungen> } |
stellen Vereinbarungs- und Anweisungsteil den Funktionskörper dar und
<typ>
legt den Typ des Rückgabewertes fest.
Die Kombination <funktions_name>
und (parameter_liste)
kennzeichnet eindeutig eine Funktion und wird daher als
Signatur einer Funktion bezeichnet.
Die Funktionsdefinition wird für jede Funktion genau einmal benötigt.
Im Unterschied dazu ist die Funktionsdeklaration
<speicherklasse> <typ> <funktions_name> (parameter_liste) ;
in jedem Quellfile nötig welches die Funktion <funktions_name>
aufruft.
Struktogramm:
Beispiel: Wir schreiben die Berechnung von
sgn(x) von Seite als Funktion.
(siehe Ex710.cc)
// Demonstration of function declaration and definition #include <iostream.h> double sgn(double x); // declare function sgn ... main() { double a,b; ... cin >> a; b = sgn(a); // function call cout << " sgn(" << a << ") = " << b << endl; } //--------------------------------------------- double sgn(double x) // definition of function sgn { double y; y = (x > 0 ? 1. : 0.) + (x < 0 ? -1. : 0.); return y; // return value of function sgn } |
Bemerkungen:
Die Funktion sgn()
ist durch ihre Signatur eindeutig beschrieben.
Dies hat für Deklaration und Definition von Funktionen die Konsequenzen:
double sgn(double x);
sind in obigem Beispiel erlaubt.
double sgn(double* x);
double sgn(int x);
da sich die Argumente von der Ausgangsdefinition unterscheiden. Allerdings haben wir diese neuen Funktionen noch nicht definiert.
double sgn(double& x);
ist nicht erlaubt, da die Signatur wie unter (i) ist. Daher kann der Compiler nicht herausfinden, ob die Funktion unter (iii) oder die Funktion unter (i) in der Anweisung
y = sgn(x);
gemeint ist.
double sgn(int x);
int sgn(int x);
können nicht unterschieden werden (gleiche Signatur) und daher lehnt der Compiler diesen Quelltext ab.