共用方式為


函數呼叫

「函式呼叫」是一種運算式,會將控制項和引數 (如果有的話) 傳遞至函式,且具有下列形式:

expression (expression-listopt)

其中 expression 是函式名稱,或會評估為函式位址,而 expression-list 是運算式的清單 (以逗號分隔)。 這些後方運算式的值為傳遞至函式的引數。 如果函式不會傳回值,那麼您會將它宣告為傳回 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 會使用下列函式呼叫,從迴圈內部呼叫選取的 for 函式:

( *function )( i );

其中一個引數 i 會傳遞至呼叫的函式。

請參閱

函式