我想將一個字符串傳遞給C函數,其中函數將解析出函數名稱,函數的參數及其數據類型,然後爲我調用函數。什麼是最好的方法?將包含函數名稱及其參數的字符串傳遞給另一個函數。
回答
如果你想編寫一個格式字符串和可變參數的功能等:
int function(const char* strFormat, ...)
{
//parse out the format using regex or something
//then store the data into the variable aruments
//or create a string concatenating everything
}
一樣,說的printf,sprintf的,或scanf的確,
那麼最好的東西給你做看看一些很好的教程。
http://msdn.microsoft.com/en-us/library/fxhdxye9(v=vs.80).aspx
http://www.cprogramming.com/tutorial/c/lesson17.html
如果你想真正傳遞一個函數名要調用的函數,其參數一起,你要麼需要實現你的C代碼,某種形式的反思或反省的,一個非常複雜的switch語句,它根據字符串值爲你調用函數,或者編寫一些複雜的宏作爲一種輔助編譯器。
glib的gobject是c中反省的一個很好的例子。 http://developer.gnome.org/gobject/stable/
簡單的東西,而不自省可能是:
void* function (const char* strFunctionName, ...)
{
if(!strcmp(strFunctionName, "functionA"))
{
//use va_list to parse out the arguments for the function.
functionA(//each of the arguments from va_list);
}
else if(!strcmp(strFunctionName, "functionB"))
{
//use va_list to parse out the arguments for the function.
functionB(//args from va_list);
}
...
}
如果你心裏有更具體的東西,請在你的問題中指定。
感謝您的時間,但你沒有得到我的問題。我沒有嘗試一個函數的變量數量的參數。我在想什麼是假設我有一個字符串char * str =「方差(dArray,p1,p2) 「。如何將該字符串作爲正常函數調用 – johnkrishna 2012-01-31 05:44:57
@johnkrishna使用可變參數將使數據類型及其值的解析比編寫令人難以置信的複雜正則表達式更容易。 – 2012-01-31 05:56:48
非常感謝你再次,但我們都在不同的軌道上似乎。在我的情況下,每次字符串將保持變化,這取決於我收到的參數,所以我只需要如何使我的C編譯器將我的字符串視爲一個函數調用。 – johnkrishna 2012-01-31 06:06:07
如果你想:
char *funct = "foo(bar)";
實際調用該函數foo()
,那麼它是不可能的,C是行不通的方式。我會建議:
a)你坐下來重新考慮你的應用程序,因爲任何事情都不需要這樣的行爲。
B)嘗試用這樣的能力,如Objective-C的
c)一種語言,如果你真的,真的,真的想這樣做......然後做一個字符串解析器和大量的,如果公司或函數指針。東西的線路:
- 獲取字符串「功能(VAR1,VAR2,...,VARN)」的形式
- 獲取函數的名稱(即之前的一切「(」)
- 獲取的所有參數(
strtok()
例如) - 識別功能,與你的字符串比較恆定的名稱(
strcmp()
) - 如果參數數值(
isdigit()
或sscanf(string, "%d", ¶meter) > 0
)將其轉換爲可用原語(atoi()
,atof()
等或sscanf()
) - 將params傳遞給你的函數。
謝謝你,我認爲你的選擇c會對我有幫助。有沒有在C + +的方式? – johnkrishna 2012-01-31 10:20:51
@johnkrishna在任何不支持反射的語言中,都無法做到這一點。如果你想做的話,你的c-like選項是Java,Objective-C或C#。或者你可以在c或C++中自己實現反射。 – 2012-01-31 15:42:14
@whitlionV在這裏函數的參數將保持改變,在這種情況下如何識別類型(因爲strtok()將它們全部作爲字符串) – johnkrishna 2012-02-06 08:15:02
我不確定這是否爲標準,但您可以在C++中使用__PRETTY_FUNCTION__
。
如:
void foo(int a, int b)
{
cout << __PRETTY_FUNCTION__ << endl;
}
輸出:
void foo(int, int)
感謝您的編輯:) – NullPointer 2012-01-31 14:34:48
如果你想從一個字符串執行代碼(我只是猜測,你的問題是很難理解),則有許多選項可供選擇:將整個Clang和LLVM嵌入代碼中(並確保其JIT知道您將要導出的所有聲明)嵌入簡單的腳本語言(如Lua或Guile)併爲所有人提供包裝你想用這種方式調用的函數。
雅我想執行的方法是在string.but這是在C/C++。正確理解我的問題看到這個http://stackoverflow.com/questions/9156389/how-to-parse-a-string-so-that-compiler-executes-the -statements-inside – johnkrishna 2012-02-06 08:08:25
不,你的問題還很不清楚。而且,btw。'Clang'是一個C編譯器。你可能也想嘗試嵌入'tcc'(它是專門爲此目的而製作的),它比clang小得多,速度快。 – 2012-02-06 08:13:57
- 1. 將函數傳遞給另一個函數,並將其稱爲
- 2. 將字符串參數傳遞給函數並將其更改
- 3. 將函數的所有參數傳遞給另一個函數
- 4. 將函數的參數直接傳遞給另一個函數
- 5. 傳遞函數的參數作爲參數傳遞給另一個函數
- 6. 如何將命名參數傳遞給另一個函數需要的函數?
- 7. C++:如何將參考函數傳遞給另一個函數?
- 8. 將參數傳遞給函數,該參數必須作爲參數傳遞給python中的另一個函數
- 9. 將函數作爲另一個函數的參數傳遞給嵌套函數
- 10. 傳遞函數的所有參數給另一個函數
- 11. 基於包含函數名稱的字符串調用函數
- 12. 將字符串傳遞給函數
- 13. 將字符串傳遞給jquery函數
- 14. 將字符串傳遞給onItemClick函數
- 15. Swift - 將相同的參數從一個函數傳遞給另一個函數
- 16. 將一個函數的所有參數傳遞給另一個函數?
- 17. 的Javascript:如何通過使用字符串參數的函數作爲參數傳遞給另一個函數
- 18. 將一個函數的值傳遞給另一個函數
- 19. 傳遞函數名稱作爲C++類中的另一個函數的參數
- 20. 將一組函數作爲參數傳遞給Python中的另一個函數
- 21. 將參數傳遞給一個函數內的函數 - javascript
- 22. 將調用參數傳遞給Makefile中的另一個函數
- 23. 將參數傳遞給另一個腳本中的函數?
- 24. 將字符串參數傳遞給onclick javascript函數
- 25. 當局部變量名稱與函數參數名稱相同時,將關鍵字參數傳遞給函數
- 26. 將包含參數值的函數傳遞給子組件
- 27. 將參數傳遞給包含' - '的javascript函數
- 28. 無法將包含空格的參數傳遞給vbs函數
- 29. 帶參數的快捷函數...傳遞給帶參數的另一個函數
- 30. 將名稱空間傳遞給函數
「將[字符串]作爲函數調用」沒有任何意義。 – 2012-01-31 05:15:13
我很樂意提供幫助,但我無法理解您的問題。請修改並重試。 – 2012-01-31 05:16:17
@CodyGray和Jonathan Henson我正在處理可變數量的參數。因此,對於每個不同的函數調用,我都會得到不同的參數列表,所以這就是爲什麼我要用所有參數形成一個字符串。 – johnkrishna 2012-01-31 05:20:59