函式動態呼叫 研究
阿新 • • 發佈:2018-12-23
動態呼叫:
根據使用者(程式設計師)的輸入,呼叫相應的函式。與一般的呼叫函式不同的是,它可以動態的呼叫,動態體現在想更換呼叫函式時,可以很輕鬆的更換,只需改函式名的字串就行。這種動態呼叫的方法,在程式碼很多時,使用非常便利。
具體實現步驟:
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;
}