A function call is an expression that passes control and arguments (if any) to a function and has the form
expression ( expression-list opt )
where expression is a function name or evaluates to a function address and expression-list is a list of expressions (separated by commas). The values of these latter expressions are the arguments passed to the function. If the function does not return a value, then you declare it to be a function that returns void.
If a declaration exists before the function call, but no information is given concerning the parameters, any undeclared arguments simply undergo the usual arithmetic conversions.
Note:
The expressions in the function argument list can be evaluated in any order, so arguments whose values may be changed by side effects from another argument have undefined values. The sequence point defined by the function-call operator guarantees only that all side effects in the argument list are evaluated before control passes to the called function. (Note that the order in which arguments are pushed on the stack is a separate matter.) See “Sequence Points” for more information.
The only requirement in any function call is that the expression before the parentheses must evaluate to a function address. This means that a function can be called through any function-pointer expression.
This example illustrates function calls called from a switch statement:
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 this example, the function call in main,
work( count, lift );
passes an integer variable, count, and the address of the function lift to the function work. Note that the function address is passed simply by giving the function identifier, since a function identifier evaluates to a pointer expression. To use a function identifier in this way, the function must be declared or defined before the identifier is used; otherwise, the identifier is not recognized. In this case, a prototype for work is given at the beginning of the main function.
The parameter function in work is declared to be a pointer to a function taking one int argument and returning a long value. The parentheses around the parameter name are required; without them, the declaration would specify a function returning a pointer to a long value.
The function work calls the selected function from inside the for loop by using the following function call:
( *function )( i );
One argument, i, is passed to the called function.