1.5.1. Deklarace a definice funkce, návratová hodnota

Každou funkci je před jejím použitím nutné nejdříve implementovat. Rozlišujeme pojmu deklarace a definice.

Deklarace funkce je vlastně způsob jak dát překladači všechny potřebné údaje o funkci, aniž bychom ji museli celou definovat. Předtím, než funkci zavoláme, měla by být vždy předem definována, nebo deklarována. To proto, aby překladač znal všechny formální parametry, a tak mohl vytvořit správný kód. Pokud funkci nebudeme ještě před jejím voláním deklarovat ani definovat, bude překladač odhadovat formální parametry podle typu skutečných parametrů (parametry předané funkci při jejím volání), které ale nemusí odpovídat typu parametrů formálních. Výsledkem by pak byl nesprávně sestavený kód. Pokud ale z nějakého důvodu není funkce definována před svým použitím, měla by být alespoň deklarována. Deklarace funkce vypadá takhle:

Příklad 1.31. Deklarace funkce - obecná syntaxe (C)

návratový_typ identifikátor_funkce (seznam definicí formálních parametrů);

V praxi vypadá deklarace funkce například takto:

Příklad 1.32. Deklarace funkce (C)

int secti (int a, int b); // deklarace výše definované funkce.

Definice funkce začíná tzv. hlavičkou funkce. Návratový_typ určuje jakého typu bude hodnota, kterou bude funkce vracet. Jako další po identifikátoru typu píšeme identifikátor funkce následovaný seznamem definicí formálních parametrů. Formální parametry jsou pak proměnné nadefinované v tomto seznamu. Ty se definují stejně jako normální proměnné, jen s tím rozdílem, že nelze zkrátit zápis více proměnných stejného typu oddělením jednotlivých identifikátorů čárkou. Po uvedení hlavičky funkce ještě následuje tělo funkce, které je tvořeno blokem. Jak už víme, na začátku bloku mohou být uvedeny lokální deklarace a definice, po kterých následují příkazy. Ty obvykle pracují s předanými parametry. Provádění funkce je ukončeno po vykonání posledního příkazu těla funkce, ale v takovém případě není možné odhadnout, jakou hodnotu funkce vrátí. Proto se používá příkaz return.

Příklad 1.33. Definice funkce - obecná syntaxe (C)

návratový_typ identifikátor_funkce (seznam definicí formálních parametrů)
{ lokální deklarace a definice;
  
  příkazy;
}

Příklad 1.34. Definice funkce - (C)

int secti (int a, int b)
{ return a+b;
}

Tento příkaz způsobí okamžité opuštění funkce, ve které je použit. Hodnota nepovinného výrazu1 je pak návratovou hodnotou funkce. Pokud výraz1 neuvedeme, bude návratová hodnota předem neurčitelná. Pak bychom ale neměli tuto hodnotu nikde používat.

Volání funkce je chápáno jako výraz a to určuje i místo jeho použití (např. operand některého operátoru, ve výrazovém příkazu, jako skutečný parametr jiné funkce). Při volání funkce je provedeno několik kroků. Nejdříve je uložena adresa instrukce, na kterou se skočí po skončení provádění funkce. Pak se alokuje paměť pro formální parametry funkce, do kterých se následně zkopírují hodnoty parametrů skutečných. Formální parametry jsou vlastně lokální proměnné, a tedy existují pouze po dobu vykonávání funkce a jsou viditelné pouze z těla funkce. Když vykonávání funkce skončí, je paměť vyhrazená pro tyto proměnné uvolněna a jako výsledek volání funkce se použije její návratová hodnota (většinou tedy hodnota výrazu za příkazem return). Uvedený způsob předávání parametrů se nazývá předávání hodnotou a znamená, že hodnoty skutečných parametrů jsou pouze zkopírovány do formálních parametrů. Ve funkci se pak pracuje pouze s těmito kopiemi. Předávání parametrů odkazem je v C realizováno pomocí ukazatelů, ale o těch až někdy jindy.

Příklad 1.35. Volání funkce (C)

a = secti(3,5); 
//do proměnné a se uloží výsledek po volání funkce secti(3,5)
        

Více viz. [Builder1]