Navigation

2.5.1 Vereinbarung von Funktionen

Die Definition einer Funktion besteht aus einem Funktionskopf und einem Funktionskörper.
Kernighan:
speicherklasse typ name ( parameter_liste)
parameter_deklarations_liste
{
vereinbarungs_liste
anweisungs_liste
}

ANSI-C:
speicherklasse typ name ( parameter_deklarations_liste)
{
vereinbarungs_liste
anweisungs_liste
}
Die zweite Form entspricht dem Standard ANSI-C und unterstützt die Typprüfung der Argumente bei der Übersetzung des Programms.

VERBATIM/b251b: 

 int f(a, b, c)             /* entspricht der urspruenglichen */
     int a, b;                 /* Vereinbarung von Funktionen */
     double c;
 { . . . }

 double potenz (double basis, int exponent)
 { . . . }                         /* neuere Form nach ANSI-C */

typ gibt den Typ des Funktionsergebnisses an. Mögliche Typen sind:
- alle Grunddatentypen, wie char, int, unsigned, float, double usw.
- Strukturen und Unions
- Zeiger auf beliebige Objekte einschl. Zeiger auf Funktionen

Nicht zulässig ist die Rückgabe von Feldern und Funktionen.

Die Deklaration einer Funktion ist die Bekanntmachung ihres Namens, ihres Typs und gegebenenfalls des Typs der formalen Parameter.
Kernighan:
speicherklasse typ name ();

ANSI-C:
speicherklasse typ name ( typ_spezifikations_liste);

VERBATIM/b251a: 

 double potenz (double, int);
 int printf (char *, ...);
 char * func (, int, , ...);

Bei diesen sogenannten Prototypvereinbarungen können Typen von Argumenten freibleiben, d.h. dieses Argument muss angegeben werden, es folgt aber keine Typprüfung. Die Angabe ... bedeutet, es können beliebig viele weitere Argumente folgen (ohne Typprüfung).
Bemerkung: Typspezifikation ist insbesondere in C++ notwendig.

Die Deklaration einer Funktion muss immer vor dem ersten Aufruf erfolgen, wenn sie nicht bereits definiert wurde. Die Deklaration einer Funktion vom Typ int kann gegebenenfalls entfallen (Standardannahme). Die Angaben im Funktionskopf einer Funktionsdefinition müssen mit der Deklaration übereinstimmen.

In der Sprache C wird nicht zwischen den Begriffen Funktion und Prozedur unterschieden. Funktionen, die keinen Funktionswert liefern, werden bei der Definition durch das spezielle Typattribut void gekennzeichnet.

VERBATIM/b251c: 

float f1(...)         /* liefert Werte vom Typ float */ 
struct datum f2(...)  /* liefert Werte vom Strukturtyp datum */
int *f3(...)          /* liefert Zeiger auf int */ 
struct datum *f4(...) /* liefert Zeiger auf Strukturtyp datum */
int (*f5(...))[]      /* liefert Zeiger auf int Feld */

filea.c:

VERBATIM/b251fa: 

char * g(int);     /* Prototypdeklaration von Funktion g */

double f(double x) /* Definition von Funktion f */
{ ... }

fileb.c:

VERBATIM/b251fb: 

char * g(int y)    /* Definition von Funktion g */
{ ... }

Navigation