1. 程式人生 > >函式動態呼叫 研究

函式動態呼叫 研究

動態呼叫:

            根據使用者(程式設計師)的輸入,呼叫相應的函式。與一般的呼叫函式不同的是,它可以動態的呼叫,動態體現在想更換呼叫函式時,可以很輕鬆的更換,只需改函式名的字串就行。這種動態呼叫的方法,在程式碼很多時,使用非常便利。

具體實現步驟:

1.定義一個結構體型別

一般包含兩個資料型別;字元(用來表示函式名);函式指標型別(表示函式)

2.定義一個結構體陣列

存放你想呼叫的所有函式

3.定義一個函式指標型別

可以指向所有你想呼叫的函式

4.寫一個函式 功能:給定一個字串,返回一個對應的函式指標

5.最後構造一個函式   功能:傳入引數 和字串(函式名),呼叫指定函式,

實現動態呼叫

下面舉例說明:

//定義(返回值為浮點型,包含兩個浮點型引數)函式指標型別

typedef  float(*PFUN)(float a,float b);
//宣告回撥函式
float getCha(float a,float b);
float getHe(float a,float b);
float getJi(float a,float b);
float getShang(float a,float b);
PFUN getFunctionFromName(char name);
float  getValue(float a,float b,char name);
//定義一個結構體
typedef struct nameFunctionFromName{
    char name;     //函式字串
    PFUN function;        //函式名
}NameFunctionPair;
//結構體陣列
NameFunctionPair list[4]={
    {'-',getCha},
    {'+',getHe},
    {'*',getJi},
    {'/',getShang}
};
//實現加減乘除函式
float getCha(float a,float b){
    return a-b;
}
float getHe(float a,float b){
    return a+b;
}
float getJi(float a,float b){
    return a*b;
}
float getShang(float a,float b){
    return a/b;
}
//給定一個字串,返回一個函式指標
PFUN getFunctionFromName(char name){
    for (int i=0; i<4; i++) {
        if ( list[i].name==name ) {
            return  list[i].function;
        }
    }
    return NULL;

}

//動態呼叫函式
float  getValue(float a,float b,char name){
    PFUN p=getFunctionFromName(name);
    return p(a,b);
}


int main(int argc, const char * argv[]) {

    float a=getValue(2.0,3.0,'/');
    printf("%f",a);
    return 0;
}