Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Ett funktionsanrop är ett uttryck som skickar kontroll och argument (om några) till en funktion och har formuläret:
expression (expression-listopt)
där uttrycket är ett funktionsnamn eller utvärderas till en funktionsadress och uttryckslistan är en lista över uttryck (avgränsade med kommatecken). Värdena för dessa senare uttryck är argumenten som skickas till funktionen. Om funktionen inte returnerar ett värde deklarerar du det som en funktion som returnerar void.
Om det finns en deklaration före funktionsanropet, men ingen information ges om parametrarna, genomgår alla odeklarerade argument helt enkelt de vanliga aritmetiska konverteringarna.
Anmärkning
Uttrycken i listan över funktionsargument kan utvärderas i valfri ordning, så argument vars värden kan ändras av biverkningar från ett annat argument har odefinierade värden. Sekvenspunkten som definieras av funktionsanropsoperatorn garanterar endast att alla biverkningar i argumentlistan utvärderas innan kontrollen skickas till den anropade funktionen. (Observera att den ordning i vilken argument skickas på stacken är en separat fråga.) Mer information finns i Sekvenspunkter .
Det enda kravet i ett funktionsanrop är att uttrycket före parenteserna måste utvärderas till en funktionsadress. Det innebär att en funktion kan anropas via valfritt funktionspekaruttryck.
Exempel
Det här exemplet illustrerar funktionsanrop som anropas från en switch instruktion:
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 );
}
I det här exemplet anropar funktionen i main,
work( count, lift );
skickar en heltalsvariabel, count, och adressen för funktionen lift till funktionen work. Observera att funktionsadressen skickas helt enkelt genom att ge funktionsidentifieraren, eftersom en funktionsidentifierare utvärderas till ett pekaruttryck. Om du vill använda en funktionsidentifierare på det här sättet måste funktionen deklareras eller definieras innan identifieraren används. annars identifieras inte identifieraren. I det här fallet ges en prototyp för work i början av main funktionen.
Parametern function i work deklareras som en pekare till en funktion som tar ett int argument och returnerar ett long värde. Parenteserna runt parameternamnet krävs. utan dem skulle deklarationen ange en funktion som returnerar en pekare till ett long värde.
Funktionen work anropar den valda funktionen inifrån loopen for med hjälp av följande funktionsanrop:
( *function )( i );
Ett argument, i, skickas till den anropade funktionen.