Sdílet prostřednictvím


Prototypy funkcí

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í int hodnoty, 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.

Viz také

Functions