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