Partilhar via


Chamadas de função

Uma chamada de função é uma expressão que passa controle e argumentos (se houver) para uma função e tem a forma:

expressão (optda lista de expressões)

onde expression é um nome de função ou é avaliado como um endereço de função e expression-list é uma lista de expressões (separadas por vírgulas). Os valores destas últimas expressões são os argumentos passados para a função. Se a função não retornar um valor, você declarará que é uma função que retorna void.

Se uma declaração existir antes da chamada de função, mas nenhuma informação for dada sobre os parâmetros, quaisquer argumentos não declarados simplesmente passam pelas conversões aritméticas usuais.

Observação

As expressões na lista de argumentos da função podem ser avaliadas em qualquer ordem, de modo que os argumentos cujos valores podem ser alterados por efeitos colaterais de outro argumento têm valores indefinidos. O ponto de sequência definido pelo operador de chamada de função garante apenas que todos os efeitos colaterais na lista de argumentos sejam avaliados antes que o controle passe para a função chamada. (Observe que a ordem na qual os argumentos são empurrados na pilha é um assunto separado.) Consulte Pontos de sequência para obter mais informações.

O único requisito em qualquer chamada de função é que a expressão antes dos parênteses deve ser avaliada para um endereço de função. Isso significa que uma função pode ser chamada através de qualquer expressão de ponteiro de função.

Exemplo

Este exemplo ilustra chamadas de função chamadas a partir de uma switch instrução:

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 );
}

Neste exemplo, a chamada de função ,main

work( count, lift );

passa uma variável inteira, counte o endereço da função lift para a função work. Observe que o endereço da função é passado simplesmente fornecendo o identificador de função, uma vez que um identificador de função é avaliado para uma expressão de ponteiro. Para utilizar um identificador de função desta forma, a função deve ser declarada ou definida antes de o identificador ser utilizado; caso contrário, o identificador não será reconhecido. Neste caso, um protótipo para work é dado no início da main função.

O parâmetro function in work é declarado como um ponteiro para uma função tomando um int argumento e retornando um long valor. Os parênteses em torno do nome do parâmetro são obrigatórios; sem eles, a declaração especificaria uma função retornando um ponteiro para um long valor.

A função work chama a função selecionada de dentro do for loop usando a seguinte chamada de função:

( *function )( i );

Um argumento, i, é passado para a função chamada.

Ver também

Funções