函数调用

函数调用 是通过控件和参数的表达式 (如果有) 传递到函数并具有以下形式:   

表达式 (表达式列表opt)

其中 表达式 是函数名或计算为函数地址和 表达式列表 是表达式列表 (以逗号分隔)。 这些后表达式的值是传递给函数。 如果函数不返回值,则将变量声明为返回 void的功能。

如果描述存在,在函数调用,但是,前没有有关参数为,所有未声明实参通常算术转换。

备注

在函数的表达式参数列表可按任何顺序,因此值可能会产生副作用更改从另一个参数未定义值的参数进行计算。序列点定义的函数调用运算符只保证中的任何副作用参数列表进行计算,在控制权传递到调用函数之前。(请注意参数推入堆栈的顺序是一个单独的事物。)请参见 序列点 有关更多信息。

在所有的要求函数调用是在括号中的表达式必须计算为函数地址。 这意味着函数可通过所有函数指针表达式调用。

示例

此示例演示函数调用从 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 );
}

在本例中, main函数调用,

work( count, lift );

通过整数变量、 count和函数 lift 的地址传递给函数 work。 请注意函数地址传递给函数标识符,通过,因为函数标识符计算为指针表达式。 该功能,在使用之前,若要以这种方式使用函数标识符,必须声明或定义该标识符;否则,该标识符不识别。 在这种情况下, work 的原型在 main 的开头为。

在 work 的参数 function 声明为指向采用一 int 参数和返回 long 值的函数。 需要在参数名两边的括号;不包括属性,声明中指定函数返回指向 long 值。

函数 work 从 循环内调用所选函数使用以下函数调用:

( *function )( i );

一个参数, i,通过返回到调用函数。

请参见

概念

功能(c)