|
}
Der Aufruf kann dann z. B. als Anweisung x = blabla(); erfolgen.
Funktionen sind stets global: sie können nur außerhalb jeder anderen
Funktion (einschließlich main()) definiert werden, und sind dann aus jeder
Funktion (einschließlich derselbigen, siehe unten: Rekursion) aufrufbar.
Funktionsdefinitionen lassen sich demnach in C nicht schachteln, sie werden alle auf
einer "Ebene" definiert.
Die Definition einer Funktion wird syntaktisch beschreiben als:
Eine Funktion hat also einen festgelegten Aufbau (genauere Definition der
ersten Zeile siehe unten):
Typ Funktionsname(Parameterliste)
{
Vereinbarungen
Anweisungen
return (Funktionswert) optional
}
Die runden Klammern bei der Vereinbarung müssen stehen, damit Funktionsname
zur Funktion wird. Die Parameterliste in den runden Klammern ist optional, d.h.
sie muß nur vorhanden sein, wenn der Funktion wirklich Parameter
übergeben werden. Andernfalls ist als Platzhalter void anzugeben.
Die Parameterliste enthält sowohl die Namen als auch die Typdeklarationen der
Parameter. Die Gesamtheit der Vereinbarungen und Anweisungen der Funktion
selbst nennt man den Funktionskörper ("body"), er muß durch
geschweifte Klammern eingeschlossen sein.
Die return-Anweisung darf an beliebiger Stelle im Funktionskörper
stehen, mit ihr erfolgt der Rücksprung in die aufrufende Funktion oder
ins Hauptprogramm. Die return-Anweisung kann auch ganz fehlen, dann erfolgt
der Rücksprung in die aufrufende Funktion beim Erreichen
des Funktionsendes (der schließenden geschweiften Klammer
um den Funktionkörper).
Der Funktionswert hinter der return-Anweisung wird meist
in runde Klammern eingeschlossen. Dies ist aber nicht notwendig.
Fehlt der Funktionswert, so wird an die aufrufende Funktion auch
kein Wert zurückgegeben.
Ebenfalls erlaubt und bei älteren C-Programmen (nicht ANSI-C)
häufig zu finden ist folgender Funktionsaufbau:
Typ Funktionsname(optionale Parameternamen)
Parameterdeklarationen
{
Vereinbarungen
Anweisungen
return (Funktionswert) optional
}
Die Parameternamen müssen alle in zugehörigen Parameterdeklarationen
auftauchen.
Im Prinzip sieht ein C-Programm immer wie das folgende Beispiel aus:
void main (void)
{
int x, y;
...
blabla ();
...
x = foobar(y);
...
}
void blabla (void)
{
...
}
int foo ();
{
...
}
int foobar (int x)
{
...
x = 10 * foo();
...
}
Dabei ergibt sich ein Problem. In main() ist nälich noch gar nicht bekannt,
welche Parameter die Funktionen blabla(), foo() und foobar()
haben, welchen Typ die Parameter besitzen und welche Rückgabewert die Funktion hat.
Die Funktionen werden ja erst unterhalb von main() definiert. Der C-Compiler
nimmt dann int als Standardtyp an. Lösen läßt sich das
Problem durch eine Vorwärts-Deklaration der Funktionen. Dabei werden nur
Funktionsname und Parameter angegeben und die Angabe mit Strichpunkt abgeschlossen.
Die Funktionsdefinition an anderer Stelle enthält dann auch den Code
dazu. Zum Beispiel:
void blabla (void);
int foo ();
int foobar(int x);
void main (void)
...
weiter wie oben
...
Das Syntaxdiagram für die Definition des Prototypen sieht so aus:
|
|
|