Chiamate di funzioneFunction Calls

Una chiamata di funzione è un'espressione che trasferisce il controllo e gli argomenti (se presenti) a una funzione e ha il formato seguente:A function call is an expression that passes control and arguments (if any) to a function and has the form:

expression (expression-listopt)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).where expression is a function name or evaluates to a function address and expression-list is a list of expressions (separated by commas). I valori di queste ultime espressioni sono gli argomenti passati alla funzione.The values of these latter expressions are the arguments passed to the function. Se la funzione non restituisce un valore, dichiararla come funzione che restituisce void.If the function does not return a value, then you declare it to be a function that returns 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.If a declaration exists before the function call, but no information is given concerning the parameters, any undeclared arguments simply undergo the usual arithmetic conversions.

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.The expressions in the function argument list can be evaluated in any order, so arguments whose values may be changed by side effects from another argument have undefined values. 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.The sequence point defined by the function-call operator guarantees only that all side effects in the argument list are evaluated before control passes to the called function. Tenere presente che l'ordine in cui gli argomenti vengono inseriti nello stack è un altro aspetto diverso. Per altre informazioni, vedere Punti di sequenza.(Note that the order in which arguments are pushed on the stack is a separate matter.) See Sequence Points for more information.

L'unico requisito per qualsiasi chiamata di funzione è rappresentato dal fatto che l'espressione prima della parentesi deve restituire un indirizzo di funzione.The only requirement in any function call is that the expression before the parentheses must evaluate to a function address. Questo significa che una funzione può essere chiamata tramite qualsiasi espressione di puntatore a funzione.This means that a function can be called through any function-pointer expression.

EsempioExample

In questo esempio sono illustrate le chiamate di funzione definite da un'istruzione switch:This example illustrates function calls called from a switch statement:

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 mainIn this example, the function call in main,

work( count, lift );  

passa una variabile di tipo Integer, count, e l'indirizzo della funzione lift alla funzione work.passes an integer variable, count, and the address of the function lift to the function work. Si noti che l'indirizzo della funzione viene passato semplicemente specificando l'identificatore della funzione, che restituisce un'espressione puntatore.Note that the function address is passed simply by giving the function identifier, since a function identifier evaluates to a pointer expression. 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.To use a function identifier in this way, the function must be declared or defined before the identifier is used; otherwise, the identifier is not recognized. In questo caso, un prototipo per work viene fornito all'inizio della funzione main.In this case, a prototype for work is given at the beginning of the main function.

Il parametro function in work viene dichiarato come puntatore a una funzione che accetta un argomento int e restituisce un valore long.The parameter function in work is declared to be a pointer to a function taking one int argument and returning a long value. Le parentesi che racchiudono il nome di parametro sono obbligatorie. Senza di esse la dichiarazione specificherebbe una funzione che restituisce un puntatore a un valore long.The parentheses around the parameter name are required; without them, the declaration would specify a function returning a pointer to a long value.

La funzione work chiama la funzione selezionata dall'interno del ciclo for tramite la chiamata di funzione seguente:The function work calls the selected function from inside the for loop by using the following function call:

( *function )( i );  

Un argomento, i, viene passato alla funzione chiamata.One argument, i, is passed to the called function.

Vedere ancheSee Also

FunzioniFunctions