Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Een functiedeclaratie gaat vooraf aan de functiedefinitie en geeft de naam, het retourtype, de opslagklasse en andere kenmerken van een functie op. Als prototype moet de functiedeclaratie ook typen en id's voor de argumenten van de functie instellen.
Syntaxis
declaration:
declaration-specifiers
attribute-seq
optereninit-declarator-listopteren;
/*
attribute-seq
opt is Microsoft-specifiek */
declaration-specifiers:
storage-class-specifier
declaration-specifiers
opteren
type-specifier
declaration-specifiers
opteren
type-qualifier
declaration-specifiers
opteren
init-declarator-list:
init-declarator
init-declarator-list
,
init-declarator
init-declarator:
declarator
declarator
=
initializer
declarator:
pointer
kiezen voordirect-declarator
direct-declarator: /* Een functiedeclaratie */
direct-declarator
(
parameter-type-list
) /* Declaratie van nieuwe stijl */
direct-declarator
(
identifier-list
opteren) /* Verouderde declaratie van declaratie */
Het prototype heeft dezelfde vorm als de functiedefinitie, behalve dat het wordt beëindigd door een puntkomma direct na het haakje sluiten en dus geen hoofdtekst heeft. In beide gevallen moet het retourtype overeenkomen met het retourtype dat is opgegeven in de functiedefinitie.
Functieprototypes hebben de volgende belangrijke toepassingen:
Ze bepalen het retourtype voor functies die andere typen retourneren dan
int. Hoewel voor functies die waarden retournerenintgeen prototypen nodig zijn, worden prototypen aanbevolen.Zonder volledige prototypes worden standaardconversies uitgevoerd, maar er wordt geen poging gedaan om het type of het aantal argumenten met het aantal parameters te controleren.
Prototypen worden gebruikt om aanwijzers naar functies te initialiseren voordat deze functies worden gedefinieerd.
De parameterlijst wordt gebruikt om te controleren of de argumenten in de functie-aanroep overeenkomen met de parameters in de functiedefinitie.
Het geconverteerde type van elke parameter bepaalt de interpretatie van de argumenten die de functie aanroept op de stack. Een type komt niet overeen tussen een argument en een parameter, waardoor de argumenten op de stack verkeerd worden geïnterpreteerd. Als op een 16-bits computer bijvoorbeeld een 16-bits aanwijzer wordt doorgegeven als argument en vervolgens als parameter long wordt gedeclareerd, worden de eerste 32 bits op de stack geïnterpreteerd als een long parameter. Deze fout veroorzaakt niet alleen problemen met de long parameter, maar met alle volgende parameters. U kunt fouten van dit type detecteren door volledige functieprototypes voor alle functies te declareren.
Met een prototype worden de kenmerken van een functie vastgelegd. Vervolgens kunnen functie-aanroepen die voorafgaan aan de functiedefinitie (of die voorkomen in andere bronbestanden) worden gecontroleerd op niet-overeenkomende argumenten en retourtypen. Als u bijvoorbeeld de static opslagklasseaanduiding opgeeft in een prototype, moet u ook de static opslagklasse in de functiedefinitie opgeven.
Volledige parameterdeclaraties (int a) kunnen worden gecombineerd met abstracte declaraties (int) in dezelfde declaratie. De volgende verklaring is bijvoorbeeld legaal:
int add( int a, int );
Het prototype kan zowel het type als een id bevatten voor elke expressie die als argument wordt doorgegeven. Dergelijke id's vallen echter alleen binnen het bereik tot het einde van de declaratie. Het prototype kan ook het feit weerspiegelen dat het aantal argumenten variabel is of dat er geen argumenten worden doorgegeven. Zonder een dergelijke lijst kunnen niet-overeenkomende gegevens niet worden weergegeven, zodat de compiler geen diagnostische berichten over deze berichten kan genereren. Zie Argumenten voor meer informatie over typecontrole.
Het prototypebereik in de Microsoft C-compiler is nu ANSI-conform bij het compileren met de /Za compileroptie. Als u een struct of union tag binnen een prototype declareert, wordt de tag ingevoerd in dat bereik in plaats van op globaal bereik. Wanneer u bijvoorbeeld compileert met /Za ansi-conformiteit, kunt u deze functie nooit aanroepen zonder dat een typefout wordt weergegeven die niet overeenkomt:
void func1( struct S * );
Als u uw code wilt corrigeren, definieert of declareert u de struct of union in het globale bereik vóór het prototype van de functie:
struct S;
void func1( struct S * );
Onder /Zewordt de tag nog steeds ingevoerd in het globale bereik.