1. 程式人生 > 實用技巧 >回撥函式與普通函式呼叫分不清楚?3分鐘幫你搞定!

回撥函式與普通函式呼叫分不清楚?3分鐘幫你搞定!

在剛開始學習函式呼叫時,不少初學者弄不清楚“普通函式呼叫”和“回撥函式”之間的區別,下面做一個簡單的對比分析。

一句話簡單區分:
普通函式呼叫: 函式直接被呼叫
回撥函式:   函式作為引數被呼叫

這樣解釋或許還是不夠直觀,我們直接看例子吧!


普通函式呼叫

#include <stdio.h>

// 被呼叫的函式1
int func1(int value)
{
    printf("This is func1,value = %d\n",value);
    return 0;
}


// 被呼叫的函式2
int func2(int
value) { printf("This is func2,value = %d\n",value); return 0; } // 普通函式呼叫 int handle_call_back(int value1,int value2) { func1(value1); // 函式直接被呼叫 func2(value2); // 函式直接被呼叫 return 0; } int main(void) { int a = 66; int b = 88; handle_call_back(a,b); return 0; }

執行結果

This is
func1,value = 66 This is func2,value = 88


可以看出,這裡普通函式的呼叫,是直接呼叫函式名func1和func2。


不帶參的回撥函式

#include <stdio.h>

// 被呼叫的函式1
int call_back1(void)
{
    printf("This is call_back1\n");
    return 0;
}

// 被呼叫的函式2
int call_back2(void)
{
    printf("This is call_back2\n");
    return 0;
}

// 回撥函式
int handle_call_back(int
(*call_back)(void)) { call_back(); return 0; } int main(void) { handle_call_back(call_back1); // 函式作為引數被呼叫 handle_call_back(call_back2); // 函式作為引數被呼叫 return 0; }

執行結果

This is call_back1
This is call_back2
可以看出,call_back系列函式是作為handle_call_back的引數被呼叫的。上面是不帶引數的回撥函式,那帶參的回撥函式呢?

帶引數的回撥函式

#include <stdio.h>

// 被呼叫的函式1
int call_back1(int value1)
{
    printf("This is call_back1,value = %d\n",value1);
    return 0;
}

// 被呼叫的函式2
int call_back2(int value2)
{
    printf("This is call_back2,value = %d\n",value2);
    return 0;
}

// 回撥函式
int handle_call_back(int value,int (*call_back)(int))
{
    call_back(value);
    return 0;
}

int main(void)
{
    int a = 10;
    int b = 20;
    handle_call_back(a,call_back1); // 函式作為引數被呼叫
    handle_call_back(b,call_back2); // 函式作為引數被呼叫
    return 0;
}

執行結果

This is call_back1,value = 10
This is call_back2,value = 20

上面的例子可以看出,handle_call_back中的引數value,可以傳給int (*call_back)(int),實現了帶參回撥函式。