Kernighan:Die zweite Form entspricht dem Standard ANSI-C und unterstützt die Typprüfung der Argumente bei der Übersetzung des Programms.
speicherklasse typ name ( parameter_liste)
parameter_deklarations_liste
{
vereinbarungs_liste
anweisungs_liste
}
ANSI-C:
speicherklasse typ name ( parameter_deklarations_liste)
{
vereinbarungs_liste
anweisungs_liste
}
typ gibt den Typ des Funktionsergebnisses an. Mögliche Typen sind:
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 */
- 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: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).
speicherklasse typ name ();
ANSI-C:
speicherklasse typ name ( typ_spezifikations_liste);
VERBATIM/b251a: double potenz (double, int); int printf (char *, ...); char * func (, int, , ...);
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.
filea.c:
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 */fileb.c:
VERBATIM/b251fa: char * g(int); /* Prototypdeklaration von Funktion g */ double f(double x) /* Definition von Funktion f */ { ... }
VERBATIM/b251fb: char * g(int y) /* Definition von Funktion g */ { ... }