Freigeben über


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 für externen (Datei-)Bereich zulässig */
    function-definition

    declaration

  • function-definition: /* Der Deklarator hier ist der Funktionsdeklarator */
    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-Deklaration

  • declarator:
    pointer opt direct-declarator

  • direct-declarator: /* Ein Funktionsdeklarator */
    direct-declarator ( parameter-type-list ) /* Neuer Deklarator*/

    direct-declarator ( identifier-list opt ) /* Veralteter Deklarator */

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:
    Deklarator "declaration-specifiers"

    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: /* Der Funktionsrumpf*/
    { 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 static-Bezeichner gibt an, dass auf die Funktion nicht von anderen Dateien verwiesen werden kann, d. h. der Name wird nicht vom Linker 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-Bezeichner 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.

direct-declarator (in der declarator-Syntax) legt den Namen der Funktion, die definiert wird, fest 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 wird.

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

Konzepte

Funktionen (C)