函数调用通过函数名字符串调用函数【C语言版】
在寫這篇文章之前,xxx已經寫過了幾篇關于改函數調用主題的文章,想要了解的朋友可以去翻一下之前的文章
????
問題引入
????在C中,函數先定義,后使用。舉個簡單的例子
/************************ * add by oscar999 ************************/ func1() {printf("this is func1!\n"); }void main() {func1(); }????定義了一個簡單的函數func1, 調用的時候只需要"函數名()" 的方法就能夠調用的到。(至于調用的進程是如何處理的,就要參考匯編的知識了。)
????但是,在現實的開發進程當中可能會碰到這種情況, 函數名事先其實不肯定,函數名是通過一個字符串變量保存的,這種狀態該如何調用呢?
????更詳細一點的例子,函數名是通過外部輸入進去了。
/************************ * add by oscar999 ************************/ void func1() {printf("this is func1!\n"); }void main() {char c[20] = "\0";printf("please input func name:");scanf("%s",c); //input func1//how run func1 ??? }????該如何執行func1呢?
????
????
函數指針
????解決以上問題之前, 首先引入函數指針的觀點。
????在C語言中,某一數據變量的內存地址可以存儲在相應的指針變量中,比如 int * , char * 等,
????對于函數來說,也一樣如此,函數的首地址也可以存儲在某個函數指針變量里,通過這個函數指針變量我們就能夠調用所指向的函數了。
????如何定義函數指針變量? 很簡單。
????對應到下面 func1 函數,可以定義如下的指針變量。
????void (*funcP)()
????funcP這個名字可以隨便取。以下例子通過函數指針調用函數。
/************************ * add by oscar999 ************************/ func1() {printf("this is func1!\n"); }void main() {void (*funcP)();funcP = &func1;(*funcP)(); }????
????
使用函數指針實現函數名字符串調用函數
????有了如上的例子,不難想到:
????如果我們事先定義一些函數指針,通過傳入的函數名字串,失掉相應的函數指針,就能夠實現函數調用了。
每日一道理盈盈月光,我掬一杯最清的;落落余輝,我擁一縷最暖的;灼灼紅葉,我拾一片最熱的;萋萋芳草,我摘一束最燦的;漫漫人生,我要采擷世間最重的———毅力。
/************************ * add by oscar999 ************************/ #include <stdio.h>typedef void (*funcP)(); void func1() {printf("this is func1!\n"); } void func2() {printf("this is func2!\n"); } funcP getFuncPointer(char* sfuncname) {if(strcmp(sfuncname,"func1")==0){return &func1;}else if(strcmp(sfuncname,"func2")==0){return &func2;}return NULL; }void main() {char c[20] = "\0";funcP funcp = NULL;printf("please input func name:");scanf("%s",c); //input func1 or func2funcp = getFuncPointer(c); if(funcp!=NULL){(*funcp)();} }
????你可能會想,通過傳入的string 直接調用對應的function不就能夠了嗎?類似:
/************************ * add by oscar999 ************************/ #include <stdio.h>typedef void (*funcP)(); void func1() {printf("this is func1!\n"); } void func2() {printf("this is func2!\n"); } void main() {char c[20] = "\0";funcP funcp = NULL;printf("please input func name:");scanf("%s",c); //input func1 or func2if(strcmp(c,"func1")==0){func1();}else if(strcmp(c,"func2")==0){func2();} }????以上這種對于 function 較少的狀態可以使用, 但是func很多的話, 或者動態的生成這部分的話,指針函數的方法就很好了。
????現實設計師,可以把 函數名字串和函數指針放到一個name value set 中去, 這樣就能夠很容易失掉函數指針了。
????
????
?
????
帶參數的狀態
文章結束給大家分享下程序員的一些笑話語錄: 系統程序員
1、頭皮經常發麻,在看見一個藍色屏幕的時候比較明顯,在屏幕上什幺都看不見的時候尤其明顯;
2、乘電梯的時候總擔心死機,并且在墻上找reset鍵;
3、指甲特別長,因為按F7到F12比較省力;
4、只要手里有東西,就不停地按,以為是Alt-F、S;
5、機箱從來不上蓋子,以便判斷硬盤是否在轉;
6、經常莫名其妙地跟蹤別人,手里不停按F10;
7、所有的接口都插上了硬盤,因此覺得26個字母不夠;
8、一有空就念叨“下輩子不做程序員了”;
9、總是覺得9號以后是a號;
10、不怕病毒,但是很害怕自己的程序;
--------------------------------- 原創文章 By
函數和調用
---------------------------------
總結
以上是生活随笔為你收集整理的函数调用通过函数名字符串调用函数【C语言版】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android】Vitamio 4.0
- 下一篇: func_num_args()