簡體   English   中英

C - 沒有函數指針的動態函數調用

[英]C - dynamic function call without a function pointer

我想動態地調用C函數(例如,形成stdlib,math ...)。 這意味着我的C程序只知道指向隨機函數(例如printf )及其簽名(編碼為char數組: char * ,...)的指針。

我的目標是一個reflectCall函數,它獲取一個指向函數( &printf )的指針,一個簽名(以某種方式編碼在char[] ),參數作為long[]long不是實際的數據類型,一個long值可以也表示雙值,指針,...)。

因此,我的反射函數的簽名如下所示:

long reflectCall(void *funcPointer, char[] types, long[] args)

該函數應該對函數*funcPointer進行實際調用,最后返回其結果。

結果,我無法創建指針指針; 比如這個:

int (*functionPtr)(int,int);

任何人都可以給我一個提示如何解決這個問題或建議任何參考實現?

它可以在純C中完成,但它不是那么簡單而且不那么快:

  1. 為要調用的所有函數創建包裝函數,例如:

     int WrapPrintf(const char* types,long* args,long* results) { // Function specific code, in this case you can call printf for each parameter while(*types) { switch(*types){ case 'i': printf("%d",(int)*args); break; case 'c': printf("%c",(char)*args); break; // .. and so on } ++types; ++args; } // Return number of filled results return 0; } int WrapFoo(const char* types,long* args,long* results) { // ..function specific code.. return 0; } 
  2. 指向包裝函數的指針:

     typedef int (*TWrapper)(const char*,long*,long*); 
  3. 為包裝函數創建表結構:

     struct STableItem{ const char *strName; TWrapper pFunc; }; 
  4. 創建一個表:

     STableItem table[] = { {"printf", &WrapPrintf}, {"foo", &WrapFoo}, {NULL, NULL} }; 
  5. 創建接口以從表中調用任何函數(按名稱搜索函數並調用它):

     int DynamicCall(const char *func_name,const char* types,long* args,long* results) { int k; for(k=0;table[k].strName != NULL;++k){ if(strcmp(func_name,table[k].strName) == 0){ return table[k].pFunc(types,args,results); } } return -1; } 
  6. 最后撥打電話:

     long args[] = {123,'b'}; long results[8]; // not nice but just for an example int res_count = DynamicCall("printf","ic",(long*)args,(long*)results); 

注意:使用哈希函數可以更快地進行名稱搜索

C不提供這樣做的設施。 您必須在特定於平台的ASM中編寫函數體。

我建議你看看libffi,它是否符合你的需求......

http://sourceware.org/libffi/
http://en.wikipedia.org/wiki/Libffi

正如其他地方所解釋的那樣,沒有辦法真正動態地做到這一點。 但是,如果您希望使用指針構建函數表,並使用某種字符串或索引來描述您想要執行的操作,那么這將以可移植的方式實現。 作為各種解析和其他“基於命令等的運行代碼”的解決方案,這並不罕見。

但它確實要求你使用某種類型的函數指針[或者在某些時候將你的void *轉換成一個]。 在C中沒有其他(甚至幾乎)可移植的方式動態調用函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM