Funktionsaufrufe
Ein Funktionsaufruf ist ein Ausdruck, der Steuerelement und Argumente (sofern vorhanden) an eine Funktion übergeben wird und das Format aufweist:
Ausdruck (AusdruckListeopt)
Ausdruck wo ein Funktionsname ist oder einer Funktionsadresse und AusdruckListe ergibt, ist eine Liste von Ausdrücken (durch Trennzeichen getrennt).Die Werte dieser letzten Ausdrücke sind die Argumente, die an die Funktion übergeben werden.Wenn die Funktion keinen Wert zurückgibt, deklarieren Sie ihn, um eine Funktion sein, die voidzurückgibt.
Wenn eine Deklaration vor dem Funktionsaufruf vorhanden ist, aber keine Informationen hinsichtlich der Parameter angegeben werden, werden alle nicht deklarierten Argumente einfach die üblichen arithmetische Konvertierungen durch.
Hinweis |
---|
Die Ausdrücke in der Liste Funktionsargument können in einer beliebigen Reihenfolge, sodass Argumente ausgewertet werden, deren Werte sich von Nebeneffekte von einem anderen Argument ist undefiniert Werte geändert werden.Der Sequenzpunkt, der aus der Aufrufoperator definiert ist, wird sichergestellt, nur dass alle Nebeneffekte in der Argumentliste ausgewertet werden, bevor die Steuerung an die aufgerufene Funktion übergeben wird.(Beachten Sie, dass die Reihenfolge der Argumente an oberster Position des Stapels als gedrückt werden, ein separater Stoff ist.) Weitere Informationen finden Sie unter Sequenzpunkte . |
Die einzige Anforderung in jedem Funktionsaufruf ist, dass der Ausdruck vor den Klammern zu einer Funktionsadresse ausgewertet werden muss.Dies bedeutet, dass eine Funktion von jedem Funktionszeiger Ausdruck aufgerufen werden kann.
Beispiel
In diesem Beispiel wird die Funktion, die von einer switch-Anweisung aufgerufen werden:
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 diesem Beispiel wird der Funktionsaufruf in main.
work( count, lift );
führt eine ganzzahlige Variable, countund die Adresse der Funktion lift an die Funktion work.Beachten Sie, dass die Funktionsadresse einfach übergeben wird, indem Sie den Funktionsbezeichner geben, da ein Zeiger auf einen Funktionsbezeichner Ausdruck ausgewertet wird.Um einen Funktionsbezeichner auf diese Weise zu verwenden, muss die Funktion deklariert oder definiert werden, bevor der Bezeichner verwendet wird. andernfalls wird der Bezeichner nicht erkannt.In diesem Fall handelt es sich um einen Prototyp für work am Anfang der main-Funktion angegeben.
Der Parameter function in work wird deklariert, um ein Zeiger auf eine Funktion, die ein Argument akzeptiert und einen intlong-Wert zurückgibt.Die Klammern um den Parameternamen sind erforderlich. ohne sie würde die Deklaration einer Funktion einen Zeiger auf einen long-Wert zurückgibt.
Die Funktion work ruft die ausgewählte Funktion aus der nach Schleife an, indem Sie den folgenden Funktionsaufruf verwendet:
( *function )( i );
Ein Argument, i, wird der aufgerufenen Funktion übergeben.