Wywołania funkcji
Wywołanie funkcji to wyrażenie, które przekazuje kontrolkę i argumenty (jeśli istnieją) do funkcji i ma postać:
wyrażenie (wyrażenie-listaopt)
gdzie wyrażenie jest nazwą funkcji lub oblicza adres funkcji, a lista-wyrażeń jest listą wyrażeń (rozdzielonych przecinkami). Wartości tych końcowych wyrażeń są argumentami przekazywanymi do funkcji. Jeśli funkcja nie zwraca wartości, należy zadeklarować ją jako funkcję zwracającą wartość void
.
Jeśli deklaracja istnieje przed wywołaniem funkcji, ale nie podano żadnych informacji dotyczących parametrów, wszystkie niezdecydowane argumenty są po prostu poddawane zwykłym konwersjom arytmetycznym.
Uwaga
Wyrażenia na liście argumentów funkcji można ocenić w dowolnej kolejności, więc argumenty, których wartości mogą zostać zmienione przez skutki uboczne z innego argumentu, mają niezdefiniowane wartości. Punkt sekwencji zdefiniowany przez operator wywołania funkcji gwarantuje tylko, że wszystkie skutki uboczne na liście argumentów są oceniane przed przekazaniem kontrolki do wywoływanej funkcji. (Należy pamiętać, że kolejność wypychania argumentów na stosie jest osobną sprawą). Aby uzyskać więcej informacji, zobacz Punkty sekwencji.
Jedynym wymaganiem w każdym wywołaniu funkcji jest to, że wyrażenie przed nawiasami musi zostać obliczone na adres funkcji. Oznacza to, że funkcję można wywołać za pomocą dowolnego wyrażenia wskaźnika funkcji.
Przykład
W tym przykładzie przedstawiono wywołania funkcji wywoływane z instrukcji 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 );
}
W tym przykładzie wywołanie funkcji w pliku main
work( count, lift );
przekazuje zmienną całkowitą , count
i adres funkcji do funkcji lift
work
. Należy pamiętać, że adres funkcji jest przekazywany po prostu przez nadanie identyfikatora funkcji, ponieważ identyfikator funkcji oblicza wyrażenie wskaźnika. Aby w ten sposób użyć identyfikatora funkcji, należy zadeklarować lub zdefiniować funkcję przed użyciem identyfikatora; w przeciwnym razie identyfikator nie jest rozpoznawany. W tym przypadku prototyp dla work
elementu jest podawany na początku main
funkcji.
Parametr function
w pliku work
jest deklarowany jako wskaźnik do funkcji, która przyjmuje jeden int
argument i zwraca long
wartość. Nawiasy wokół nazwy parametru są wymagane; bez nich deklaracja określałaby funkcję zwracającą long
wskaźnik do wartości.
Funkcja work
wywołuje wybraną funkcję z wewnątrz for
pętli przy użyciu następującego wywołania funkcji:
( *function )( i );
Jeden argument , i
jest przekazywany do wywoływanej funkcji.