Sdílet prostřednictvím


Volání funkcí

Volání funkce je výraz, který předává řízení a argumenty (jsou-li nějaké) funkci následujícího tvaru:   

expression (expression-listopt)

kde expression je název funkce nebo vyhodnocen jako adresa funkce a expression-list je seznam výrazů (oddělený čárkami).Hodnoty těchto pozdějších výrazů jsou argumenty předané funkci.Nevrací-li funkce hodnotu, je deklarována jako funkce vracející typ void.

Existuje-li před voláním funkce deklarace, ale nejsou dány žádné informace o parametrech, budou všechny argumenty jednoduše převedeny běžnými aritmetickými převody.

[!POZNÁMKA]

Výrazy v seznamu argumentů funkce lze vyhodnotit v libovolném pořadí, proto argumenty, jejichž hodnoty mohou být změněny vedlejšími účinky jiného argumentu, mají nedefinované hodnoty.Sekvenční bod definovaný operátorem volání funkce zaručuje pouze, že před předáním řízení volané funkci jsou vyhodnoceny všechny vedlejší účinky seznamu argumentů. (Povšimněte si, že pořadí, v nichž jsou argumenty ukládány do zásobníku, je jinou záležitostí.) Viz Sekvenční body, pro další informace.

Jediným požadavkem na jakékoli volání funkce je, že výraz před závorkami musí být vyhodnocen jako adresa funkce.To znamená, že funkci lze zavolat libovolným výrazem ukazatele na funkci.

Příklad

Tento příklad znázorňuje volání funkcí volaných z příkazu switch:

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 ve funkci main,

work( count, lift );

předává celočíselnou proměnnou count a adresu funkce lift funkci work.Povšimněte si, že adresa funkce je předána jednoduše předáním identifikátoru funkce, protože identifikátor funkce je vyhodnocen jako výraz ukazatele.Chcete-li identifikátor funkce použít tímto způsobem, musí být před jeho použitím funkce deklarována nebo definována. V opačném případě nebude identifikátor rozpoznán.V tomto případě je prototyp funkce work uveden na začátku funkce main.

Parametr function ve funkci work je deklarován jako ukazatel na funkci přijímající jeden argument typu int a vracející hodnotu typu long.Závorky kolem názvu parametru jsou vyžadovány. Bez nich by deklarace určovala funkci vracející ukazatel na hodnotu typu long.

Funkce work volá zvolenou funkci z těla smyčky for pomocí následujícího volání:

( *function )( i );

Volané funkci je předán jeden argument, i.

Viz také

Koncepty

Funkce (C)