Condividi tramite


Chiamate di funzioni

Una chiamata di funzione è un'espressione che trasferisce il controllo e gli argomenti (se presenti) a una funzione e ha il formato seguente:

expression (expression-listopt)

dove expression è un nome di funzione o restituisce un indirizzo della funzione e expression-list è un elenco di espressioni (separate da virgole). I valori di queste ultime espressioni sono gli argomenti passati alla funzione. Se la funzione non restituisce un valore, dichiararla come funzione che restituisce void.

Se prima della chiamata di funzione esiste una dichiarazione, ma non viene fornita alcuna informazione relativa ai parametri, tutti gli argomenti non dichiarati subiscono semplicemente le conversioni aritmetiche normali.

Nota

Le espressioni nell'elenco di argomenti della funzione possono essere valutate in qualsiasi ordine, pertanto gli argomenti i cui valori possono essere modificati da effetti collaterali di un altro argomento hanno valori non definiti. Il punto di sequenza definito dall'operatore della chiamata di funzione assicura solo che gli effetti collaterali nell'elenco di argomenti vengano valutati prima che il controllo venga passato alla funzione chiamata. Si noti che l'ordine in cui gli argomenti vengono inseriti nello stack è una questione separata. Per altre informazioni, vedere Punti di sequenza .

L'unico requisito per qualsiasi chiamata di funzione è rappresentato dal fatto che l'espressione prima della parentesi deve restituire un indirizzo di funzione. Questo significa che una funzione può essere chiamata tramite qualsiasi espressione di puntatore a funzione.

Esempio

In questo esempio sono illustrate le chiamate di funzione definite da un'istruzione 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 );
}

In questo esempio la chiamata di funzione in main

work( count, lift );

passa una variabile di tipo Integer, count, e l'indirizzo della funzione lift alla funzione work. Si noti che l'indirizzo della funzione viene passato semplicemente specificando l'identificatore della funzione, che restituisce un'espressione puntatore. Per utilizzare un identificatore di funzione in questo modo, la funzione deve essere dichiarata o definita prima che l'identificatore venga utilizzato, altrimenti l'identificatore non è riconosciuto. In questo caso, un prototipo per work viene fornito all'inizio della funzione main.

Il parametro function in work viene dichiarato come puntatore a una funzione che accetta un int argomento e restituisce un long valore. Le parentesi intorno al nome del parametro sono obbligatorie; senza di essi, la dichiarazione specifica una funzione che restituisce un puntatore a un long valore.

La funzione work chiama la funzione selezionata dall'interno del for ciclo usando la chiamata di funzione seguente:

( *function )( i );

Un argomento, i, viene passato alla funzione chiamata.

Vedi anche

Funzioni