Volání funkcí
Volání funkce je výraz, který předá funkci ovládací prvek a argumenty (pokud existuje) a má tvar:
výraz (vyjádření výslovného souhlasu se seznamem výrazů)
where expression is a function name or evaluates to a function address and expression-list is a list of expression-list is list of expressions (separated by čárkami). Hodnoty těchto pozdějších výrazů jsou argumenty předané funkci. Pokud funkce nevrací hodnotu, deklarujete ji jako funkci, která vrací void
.
Pokud deklarace existuje před voláním funkce, ale žádné informace o parametrech nejsou uvedeny, všechny nedelarované argumenty jednoduše projdou obvyklými aritmetickými převody.
Poznámka:
Výrazy v seznamu argumentů funkce lze vyhodnotit v libovolném pořadí, takže argumenty, jejichž hodnoty mohou být změněny vedlejšími účinky z jiného argumentu, mají nedefinované hodnoty. Bod sekvence definovaný operátorem volání funkce zaručuje pouze to, že všechny vedlejší účinky v seznamu argumentů jsou vyhodnoceny před předáním ovládacího prvku do volané funkce. (Všimněte si, že pořadí, ve kterém jsou argumenty vloženy do zásobníku, je samostatná záležitost.) Další informace najdete v části Body sekvence .
Jediným požadavkem v každém volání funkce je, že výraz před závorky musí být vyhodnocen jako adresa funkce. To znamená, že funkci lze volat prostřednictvím libovolného výrazu ukazatele funkce.
Příklad
Tento příklad znázorňuje volání funkcí volaná z switch
příkazu:
int main()
{
/* Function prototypes */
long lift( int ), step( int ), drop( int );
void work( int number, long (*function)(int i) );
int select, count;
.
.
.
select = 1;
switch( select )
{
case 1: work( count, lift );
break;
case 2: work( count, step );
break;
case 3: work( count, drop );
/* Fall through to next case */
default:
break;
}
}
/* Function definition */
void work( int number, long (*function)(int i) )
{
int i;
long j;
for ( i = j = 0; i < number; i++ )
j += ( *function )( i );
}
V tomto příkladu volání funkce ,main
work( count, lift );
předá celočíselnou proměnnou count
a adresu funkce lift
funkci work
. Všimněte si, že adresa funkce se předává jednoduše tím, že identifikátor funkce se vyhodnotí jako výraz ukazatele. Chcete-li tímto způsobem použít identifikátor funkce, musí být funkce deklarována nebo definována před použitím identifikátoru; jinak se identifikátor nerozpozná. V tomto případě je na začátku main
funkce uveden prototyp work
pro.
function
Parametr in work
je deklarován jako ukazatel na funkci, která přebírá jeden int
argument a vrací long
hodnotu. Jsou vyžadovány závorky kolem názvu parametru; bez nich by deklarace určila funkci vracející ukazatel na long
hodnotu.
Funkce work
volá vybranou funkci ze smyčky for
pomocí následujícího volání funkce:
( *function )( i );
Jeden argument , i
je předán do volané funkce.