- 11/04/2016
- 3 minuty na přečtení
-
- c
- v
- n
- M
- g
-
+1
Deklarace funkce předchází definici funkce a určuje její název, návratový typ, třídu uložení a další atributy funkce. Aby byla deklarace funkce prototypem, musí také stanovit typy a identifikátory argumentů funkce.
Syntaxe
deklarace:
declaration-specifiers atribut-seqopt init-declarator-listopt ;
/* atribut-seqopt je specifický pro Microsoft */
declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt
init-declarator-list:
init-deklarátor
init-deklarátor-list , init-deklarátor
init-deklarátor:
deklarátor
deklarátor = inicializátor
deklarátor:
pointeropt direct-deklarátor
direct-deklarátor: /* Deklarátor funkce */
direct-declarator ( parameter-type-list ) /* Deklarátor nového typu */
direct-declarator ( identifier-listopt ) /* Deklarátor zastaralého typu */
Prototyp má stejnou podobu jako definice funkce s tím rozdílem, že je ukončen středníkem bezprostředně za uzavírací závorkou a nemá tedy tělo. V obou případech musí návratový typ souhlasit s návratovým typem uvedeným v definici funkce.
Prototypy funkcí mají následující důležité použití:
-
Stanovují návratový typ pro funkce, které vracejí jiné typy než
int
. Přestože funkce, které vracejí hodnotyint
, prototypy nevyžadují, prototypy se doporučují. -
Bez úplných prototypů se provádějí standardní konverze, ale nepokouší se kontrolovat typ nebo počet argumentů s počtem parametrů.
-
Prototypy se používají k inicializaci ukazatelů na funkce předtím, než jsou tyto funkce definovány.
-
Seznam parametrů slouží ke kontrole shody argumentů ve volání funkce s parametry v definici funkce.
Převedený typ každého parametru určuje interpretaci argumentů, které volání funkce umístí na zásobník. Neshoda typu argumentu a parametru může způsobit nesprávnou interpretaci argumentů na zásobníku. Například na 16bitovém počítači, pokud je jako argument předán 16bitový ukazatel, který je pak deklarován jako parametr long
, je prvních 32 bitů na zásobníku interpretováno jako parametr long
. Tato chyba způsobuje problémy nejen s parametrem long
, ale i se všemi parametry, které následují za ním. Chyby tohoto druhu můžete odhalit deklarováním úplných prototypů funkcí pro všechny funkce.
Prototyp stanovuje atributy funkce, takže volání funkce, které předchází její definici (nebo se vyskytuje v jiných zdrojových souborech), může být kontrolováno na neshodu typu argumentu a typu návratu. Pokud například v prototypu uvedete specifikátor třídy úložiště static
, musíte v definici funkce uvést také třídu úložiště static
.
V téže deklaraci lze míchat úplné deklarace parametrů (int a
) s abstraktními deklarátory (int
). Například následující deklarace je legální:
int add( int a, int );
Prototyp může obsahovat jak typ, tak identifikátor každého výrazu, který je předáván jako argument. Takové identifikátory však mají rozsah pouze do konce deklarace. Prototyp může také odrážet skutečnost, že počet argumentů je proměnný, nebo že se nepředávají žádné argumenty. Bez takového seznamu nemusí být neshody odhaleny, takže překladač nemůže generovat diagnostická hlášení týkající se těchto neshod. Další informace o kontrole typů najdete v části Argumenty.
Obsah prototypu v překladači Microsoft C je nyní při kompilaci s volbou překladače /Za kompatibilní s ANSI. To znamená, že pokud deklarujete značku struct
nebo union
v rámci prototypu, je značka zadána v tomto oboru, nikoli v globálním oboru. Například při kompilaci s parametrem /Za pro shodu s ANSI nemůžete nikdy zavolat tuto funkci, aniž byste dostali chybu neshody typu:
void func1( struct S * );
Chcete-li svůj kód opravit, definujte nebo deklarujte struct
nebo union
v globálním oboru před prototypem funkce:
struct S;void func1( struct S * );
Pod /Ze se značka stále zadává v globálním oboru.
Viz také
Funkce
.