C-Funktionsdefinitionen

Eine Funktionsdefinition gibt den Namen der Funktion, die Typen und die Zahl der Parameter, die sie erwartungsgemäß empfangen wird, und ihren Rückgabetyp an. Eine Funktionsdefinition enthält auch einen Funktionsrumpf mit den Deklarationen ihrer lokalen Variablen und die Anweisungen, die bestimmen, was die Funktion durchführt.

Syntax

translation-unit:
external-declaration
translation-unit external-declaration

external-declaration: /* Nur im externen (Datei-) Bereich zulässig */
function-definition
declaration

function-definition:
declaration-specifiersopt attribute-seqopt declarator declaration-listopt compound-statement

/* attribute-seq ist Microsoft-spezifisch */

Prototypparameter sind:

declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt

declaration-list:
declaration
declaration-list declaration

declarator:
pointeropt direct-declarator

direct-declarator: /* Ein Funktionsdeklarator */
direct-declarator ( parameter-type-list ) /* Deklarator im neuen Format */
direct-declarator ( identifier-listopt ) /* Deklarator im veralteten Format */

Die Parameterliste in einer Definition verwendet diese Syntax:

parameter-type-list: /* Die Parameterliste */
parameter-list
parameter-list , ...

parameter-list:
parameter-declaration
parameter-list , parameter-declaration

parameter-declaration:
declaration-specifiers declarator
declaration-specifiers abstract-declaratoropt

Die Parameterliste in einer Funktionsdefinition im alten Format verwendet diese Syntax:

identifier-list: /* Verwendet in veralteten Funktionsdefinitionen und Deklarationen */
identifier
identifier-list , identifier

Die Syntax für den Funktionsrumpf lautet:

compound-statement:
{ declaration-listopt statement-listopt }

Die einzigen Speicherklassenspezifizierer, die eine Funktionsdeklaration ändern können, sind extern und static . Der Bezeichner extern gibt an, dass von anderen Dateien auf die Funktion verwiesen werden kann; das bedeutet, der Funktionsname wird in den Linker exportiert. Der Spezifizierer static gibt an, dass auf die Funktion nicht von anderen Dateien verwiesen werden kann. Der Name wird vom Linker also nicht exportiert. Wenn keine Speicherklasse in einer Funktionsdefinition steht, wird extern angenommen. In jedem Fall ist die Funktion stets vom Definitionspunkt bis an das Ende der Datei sichtbar.

Der optionale declaration-specifiers-Wert und der erforderliche declarator-Bezeichner geben gemeinsam den Rückgabetyp und den Namen der Funktion an. Der declarator ist eine Kombination aus dem Bezeichner, der die Funktion benennt, und den Klammern hinter dem Funktionsnamen. Der optionale attribute-seq-Nichtterminal ist eine Microsoft-spezifische Funktion, die unter Funktionsattribute definiert wird.

Der direct-declarator (in der declarator-Syntax) legt den Namen der Funktion fest, die definiert wird, sowie die Bezeichner ihrer Parameter. Wenn direct-declarator eine parameter-type-list enthält, gibt die Liste die Typen aller Parameter an. Eine solche Deklaration dient auch als Funktionsprototyp für spätere Aufrufe der Funktion.

Eine declaration in der declaration-list in den Funktionsdefinitionen kann keinen storage-class-specifier außer register enthalten. Der type-specifier in der declaration-specifiers-Syntax kann nur dann weggelassen werden, wenn die register-Speicherklasse für einen Wert vom Typ int angegeben ist.

Die compound-statement ist der Funktionsrumpf, der lokale Variablendeklarationen, Verweise auf extern deklarierte Elemente und Anweisungen enthält.

Die Abschnitte Funktionsattribute, Speicherklasse, Rückgabetyp, Parameter und Funktionsrumpf beschreiben die Komponenten der Funktionsdefinition im Detail.

Siehe auch

Funktionen