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-specifiers
opt attribute-seq
opt declarator
declaration-list
opt compound-statement
/* attribute-seq
ist Microsoft-spezifisch */
Prototypparameter sind:
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
opt
type-specifier
declaration-specifiers
opt
type-qualifier
declaration-specifiers
opt
declaration-list
:
declaration
declaration-list
declaration
declarator
:
pointer
opt direct-declarator
direct-declarator
: /* Ein Funktionsdeklarator */
direct-declarator
(
parameter-type-list
)
/* Deklarator im neuen Format */
direct-declarator
(
identifier-list
opt )
/* 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-declarator
opt
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-list
opt statement-list
opt }
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.