Funktionsprototypen

Eine Funktionsdeklaration steht der Funktionsdefinition aus und gibt den Namen, Attributen und andere Speicherklasse Rückgabetyp einer Funktion an.Um einen Prototyp zu sein, muss die Funktionsdeklaration Typen und Bezeichner für die Argumente der Funktion festlegen.

Syntax

  • declaration:
    Deklaration ATTRIBUTE-folgendeoptBezeichner INIT-Deklarator Listeopt**;**

    ATTRIBUTE-folgendesopt/* */Microsoft-spezifische ist

  • Spezifizierer deklariert:
    Speicherklassenspezifizierer Deklaration Bezeichner opt

    Typspezifizierer Deklaration Bezeichner opt

    Spezifizierer Deklaration Qualifizierer TYPE opt

  • INIT-DeklaratorListe:
    INITDeklarator

    INIT-DeklaratorListe und INITDeklarator

  • INITDeklarator:
    Deklarator

    Deklarator = Initialisierung

  • declarator:
    ZeigeroptDirekt Deklarator

  • DirektDeklarator: func deklarator/* */A
    neuer DeklaratorDirekt Deklarator ( PARAMETER-TYPE Liste ) /* */

    Veraltet-FormatDirekt Deklarator ( Namenlisteopt**)**/* */Deklarator

Der Prototyp hat das gleiche Format wie die Funktionsdefinition, außer dass er wird durch ein Semikolon unmittelbar nach der schließenden Klammer beendet und dementsprechend kein Text vorhanden ist.In jedem Fall muss der Rückgabetyp dem Rückgabetyp entsprechen, der in der Funktionsdefinition angegeben wird.

Funktionsprototypen haben das folgende wichtige verwendet:

  • Sie legen den Rückgabetyp für Funktionen dass ein. intanders RückgabetypenObwohl Funktionen, die keine Werte zurückgeben int von Prototypen müssen Prototypen empfohlen werden.

  • Ohne vollständige Prototypen werden standardmäßige konvertierungen, aber kein wird versucht, den Typ oder die Anzahl der Argumente mit der Anzahl der Parameter zu überprüfen.

  • Prototypen werden verwendet, um Zeiger auf Funktionen zu initialisieren, bevor diese Funktionen definiert sind.

  • Die Parameterliste wird zum Überprüfen der Entsprechung der Argumente im Funktionsaufruf mit den Parametern in der Funktionsdefinition verwendet.

Der konvertierte Typ jedes Parameters bestimmt die Interpretation der Argumente, die der Funktionsaufruf auf dem Stapel abgelegt.Ein Typenkonflikt zwischen einem Parameter und einem Argument kann es sich bei den Argumenten auf dem Stapel fehlinterpretiert werden soll.Zum Beispiel auf einem 16-Bit-Computer, wenn ein 16-Bit-Zeiger als Argument übergeben wurde, als long-Parameter, die ersten 32 Bits im Stapel deklariert, werden als Parameter long interpretiert.Dieser Fehler wird nicht nur Probleme mit dem long-Parameter, aber mit allen Parametern, die ihm ausführen.Sie können Fehler dieser Art erkennen, indem Sie vollständige Funktionsprototypen für alle Funktionen deklarieren.

Ein Prototyp: Richtet die Attribute einer Funktion ein, sodass Aufrufe der Funktion, die vor seiner Definition (oder erhalten Sie in anderen Quelldateien), validiert werden können und Rückgabetyp für Argumenttyp- Konflikte.Wenn Sie beispielsweise den static Speicherklassenspezifizierer in einem Prototyp angeben, müssen Sie die static Speicherklasse in der Funktionsdefinition.

Vollständige Parameterdeklarationen (int a) können mit abstrakten Deklaratoren (int) in der gleichen Deklaration kombiniert werden.Beispielsweise ist die folgende Deklaration gültig:

int add( int a, int );

Der Prototyp kann sowohl den Typ und einen Bezeichner sind für jedes Ausdrucks, der als Argument übergeben wird.Allerdings besitzen solche Bezeichner Bereich nur bis zum Ende der Deklaration.Der Prototyp kann auch die Tatsache, dass die Anzahl der Argumente variabel ist oder dass keine Argumente übergeben werden.Ohne eine solche Liste der Konflikte werden nicht angezeigt, damit der Compiler Diagnosemeldungen über keine generieren.Weitere Informationen finden Sie unter Argumente Weitere Informationen zur Typüberprüfung.

Prototyp Microsoft C-Compiler ist jetzt im Bereich beim Kompilieren mit der /Za- ANSI-kompatibel.Dies bedeutet, dass, wenn Sie struct oder ein Union-Tag in einem Prototyp deklariert, das Tag in diesem Gültigkeitsbereich eingeführt wird, anstatt im globalen Gültigkeitsbereich.Zum Beispiel bei der Kompilierung mit /Za für ANSI-Kompatibilität, Sie diese Funktion nicht ohne einen Typenkonflikt Abrufen von Fehlern aufgerufen werden können:

void func1( struct S * );

Um den Code zu beheben, definieren Sie struct oder deklarieren oder Union im globalen Gültigkeitsbereich vor dem Funktionsprototyp:

struct S;
void func1( struct S * );

Durch /Ze wird das Tag weiterhin im globalen Gültigkeitsbereich eingeführt.

Siehe auch

Konzepte

Funktionen (C)