Funktionsaufrufe
Ein Funktionsaufruf ist ein Ausdruck, der das Steuerelement und Argumente (falls vorhanden) an eine Funktion übergibt und folgende Form annimmt:
expression (expression-list opt)
wobei expression ein Funktionsname ist oder zu einer Funktionsadresse ausgewertet ist und expression-list eine Liste von Ausdrücken (durch Trennzeichen getrennt) ist. 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 zu einer Funktion, die void zurückgibt.
Wenn eine Deklaration vor dem Funktionsaufruf vorhanden ist, jedoch keine Informationen zu dem Parameter angegeben werden, durchlaufen alle nicht deklarierten Argumente einfach die üblichen arithmetischen Konvertierungen.
Hinweis
Die Ausdrücke in der Funktionsargumentliste können in jeder Reihenfolge bewertet werden, Argumente, deren Werte sich über Nebeneffekte eines anderen Arguments ändern können, können also undefinierte Werte haben.Der Sequenzpunkt, der vom Funktionsaufrufoperator definiert ist, gewährleistet lediglich, dass alle Nebeneffekte in der Argumentliste ausgewertet werden, bevor die Steuerung an die aufgerufene Funktion übergeben wird. (Beachten Sie, dass die Reihenfolge, in der Argumente auf dem Stapel abgelegt werden, eine andere Angelegenheit ist.) Weitere Informationen finden Sie unter Sequenzpunkte.
Die einzige Anforderung in einem beliebigen Funktionsaufruf ist, dass der Ausdruck vor den Klammern mit einer Funktionsadresse ausgewertet werden muss. Dies bedeutet, dass eine Funktion von jedem Funktionszeigerausdruck aufgerufen werden kann.
Beispiel
Dieses Beispiel veranschaulicht die Funktionsaufrufe, 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 übergibt der Funktionsaufruf in main
work( count, lift );
eine ganzzahlige Variable, count, und die Adresse der Funktion lift an die work-Funktion. Beachten Sie, dass die Funktionsadresse einfach durch den Funktionsbezeichner übergeben wird, da ein Funktionsbezeichner zu einem Zeigerausdruck 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 ist ein Prototyp work am Anfang der main-Funktion gegeben.
Der Parameter function in work wird deklariert, um einen Zeiger auf eine Funktion zu ergeben, die ein int-Argument akzeptiert und einen long-Wert zurückgibt. Die Klammern um den Parameternamen sind erforderlich, denn ohne sie würde die Deklaration eine Funktion angeben, die einen Zeiger auf einen long-Wert zurückgibt.
Die Funktion work ruft die ausgewählte Funktion von innerhalb der for-Schleife auf, indem sie den folgenden Funktionsaufruf verwendet:
( *function )( i );
Ein Argument, i, wird an die aufgerufene Funktion übergeben.