2012-08-15 66 views
2

我在寫一個通用測試函數,它將接受函數地址(從映射文件讀取)和參數作爲逗號分隔的數據作爲來自套接字的參數。C中的通用函數指針

我能夠實現它已知的函數指針。

void iif(int a, int b, float f); 
typedef void (*fn_t)(int a, int b, float f); 

通過上面的方法,我會寫的函數指針的所有類型的代碼庫功能的實現。有沒有通用的方法來做到這一點?

+0

是固定函數的參數個數嗎?或者,你試圖實現的變量是什麼? – Kevin 2012-08-15 14:29:34

+0

可能與[如何結合函數指針使用可變參數](http://stackoverflow.com/questions/7308449/how-to-use-varargs-in-conjunction-with-function-pointers-in-c-在-Win64上)。 – DCoder 2012-08-15 14:30:13

回答

4

不,因爲編譯器需要知道如何表示參數。它不能知道排除信息的函數指針類型,因此它不能生成該調用。

例如,當調用多個參數時,具有少量參數的函數可能會將它們傳遞到CPU寄存器中,「溢出」到堆棧。

您可以使用可變參數來解決這個問題,這樣做基本上可以「鎖定」參數傳遞的方式。當然,它會強制被調用的函數處理可變參數,這不是很方便。

0

您可以執行以下操作。

fn_t fncptr; 
fncptr= MapAddress + 0x(offset); 

MapAdress是你的地圖文件到內存地址。 (如果C++編譯器無法將偏移量添加到void,則可以在之前將其轉換爲DWORD)Offset是文件中函數代碼的位置。但是記住,你將需要exetuce地址來指向窗口中的指針是PAGE_EXETUCE_READWRITE。如果編譯器在第一個代碼失敗ThenCall像,

fncptr(arg1, arg2, arg3); 

,這樣做: fn_t fncptr; fncptr =(fn_t)((DWORD)MapAddress + 0x(offset));