Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Deklarace funkce předchází definici funkce a určuje název, návratový typ, třídu úložiště a další atributy funkce. Aby byla deklarace funkce prototypem, musí také navazovat typy a identifikátory pro argumenty funkce.
Syntaxe
declaration:
declaration-specifiers
attribute-seq
volitinit-declarator-listvolit;
/*
attribute-seq
opt is Microsoft-specific */
declaration-specifiers:
storage-class-specifier
declaration-specifiers
volit
type-specifier
declaration-specifiers
volit
type-qualifier
declaration-specifiers
volit
init-declarator-list:
init-declarator
init-declarator-list
,
init-declarator
init-declarator:
declarator
declarator
=
initializer
declarator:
pointer
volitdirect-declarator
direct-declarator: /* Deklarátor funkce */
direct-declarator
(
parameter-type-list
) /* Deklarátor nového stylu */
direct-declarator
(
identifier-list
volit) /* Deklarátor zastaralého stylu */
Prototyp má stejnou formu jako definice funkce s tím rozdílem, že je ukončen středníkem bezprostředně za pravou závorkou, a proto nemá žádné tělo. V obou případech musí návratový typ souhlasit s návratovým typem zadaným v definici funkce.
Prototypy funkcí mají následující důležitá použití:
Vytvoří návratový typ pro funkce, které vracejí jiné typy než
int. I když funkce, které vracejíinthodnoty, nevyžadují prototypy, doporučujeme prototypy.Bez kompletních prototypů jsou provedeny standardní převody, ale není proveden žádný pokus o kontrolu typu nebo počtu argumentů s počtem parametrů.
Prototypy se používají k inicializaci ukazatelů na funkce dříve, než jsou tyto funkce definovány.
Seznam parametrů slouží ke kontrole, že argumenty ve volání funkce odpovídají parametrům v definici funkce.
Převedený typ každého parametru určuje interpretaci argumentů, které funkce volá do zásobníku. Neshoda typu mezi argumentem a parametrem může způsobit, že argumenty v zásobníku budou chybně interpretovány. Pokud je například v 16bitovém počítači předán 16bitový ukazatel jako argument, deklarován jako long parametr, prvních 32 bitů v zásobníku se interpretuje jako long parametr. Tato chyba vytváří problémy nejen s parametrem long , ale se všemi následujícími parametry. Chyby tohoto typu můžete rozpoznat deklarováním kompletních prototypů funkcí pro všechny funkce.
Prototyp vytvoří atributy funkce. Volání funkce, která předchází definici funkce (nebo které se vyskytují v jiných zdrojových souborech), lze zkontrolovat neshody typu argumentu a návratového typu. Pokud například zadáte static specifikátor třídy úložiště v prototypu, musíte také zadat static třídu úložiště v definici funkce.
Úplné deklarace parametrů (int a) se dají kombinovat s abstraktními deklarátory (int) ve stejné deklaraci. Například následující deklarace je právní:
int add( int a, int );
Prototyp může obsahovat jak typ, tak identifikátor každého výrazu, který se předává jako argument. Tyto identifikátory jsou však pouze v rozsahu až do konce deklarace. Prototyp může také odrážet skutečnost, že počet argumentů je proměnný nebo že nejsou předány žádné argumenty. Bez takového seznamu nemusí být zjištěny neshody, takže kompilátor nemůže generovat diagnostické zprávy týkající se nich. Další informace o kontrole typů naleznete v tématu Argumenty.
Při kompilaci s možností kompilátoru jazyka Microsoft C je teď rozsah prototypu v kompilátoru v souladu se službou /Za ANSI. Pokud deklarujete struct značku nebo union značku v rámci prototypu, značka se zadává v daném oboru, nikoli v globálním oboru. Například při kompilaci /Za pro shodu s ANSI nemůžete tuto funkci volat, aniž by se zobrazila chyba neshody typu:
void func1( struct S * );
Pokud chcete opravit kód, definujte nebo union deklarujte struct globální obor před prototypem funkce:
struct S;
void func1( struct S * );
V části /Zese značka stále zadává v globálním oboru.