2012-01-31 48 views
-2

我想將一個字符串傳遞給C函數,其中函數將解析出函數名稱,函數的參數及其數據類型,然後爲我調用函數。什麼是最好的方法?將包含函數名稱及其參數的字符串傳遞給另一個函數。

+0

「將[字符串]作爲函數調用」沒有任何意義。 – 2012-01-31 05:15:13

+2

我很樂意提供幫助,但我無法理解您的問題。請修改並重試。 – 2012-01-31 05:16:17

+0

@CodyGray和Jonathan Henson我正在處理可變數量的參數。因此,對於每個不同的函數調用,我都會得到不同的參數列表,所以這就是爲什麼我要用所有參數形成一個字符串。 – johnkrishna 2012-01-31 05:20:59

回答

2

如果你想編寫一個格式字符串和可變參數的功能等:

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); 
    } 
    ... 
} 

如果你心裏有更具體的東西,請在你的問題中指定。

+0

感謝您的時間,但你沒有得到我的問題。我沒有嘗試一個函數的變量數量的參數。我在想什麼是假設我有一個字符串char * str =「方差(dArray,p1,p2) 「。如何將該字符串作爲正常函數調用 – johnkrishna 2012-01-31 05:44:57

+0

@johnkrishna使用可變參數將使數據類型及其值的解析比編寫令人難以置信的複雜正則表達式更容易。 – 2012-01-31 05:56:48

+0

非常感謝你再次,但我們都在不同的軌道上似乎。在我的情況下,每次字符串將保持變化,這取決於我收到的參數,所以我只需要如何使我的C編譯器將我的字符串視爲一個函數調用。 – johnkrishna 2012-01-31 06:06:07

0

如果你想:

char *funct = "foo(bar)"; 

實際調用該函數foo(),那麼它是不可能的,C是行不通的方式。我會建議:

a)你坐下來重新考慮你的應用程序,因爲任何事情都不需要這樣的行爲。

B)嘗試用這樣的能力,如Objective-C的

c)一種語言,如果你真的,真的,真的想這樣做......然後做一個字符串解析器和大量的,如果公司或函數指針。東西的線路:

  1. 獲取字符串「功能(VAR1,VAR2,...,VARN)」的形式
  2. 獲取函數的名稱(即之前的一切「(」)
  3. 獲取的所有參數(strtok()例如)
  4. 識別功能,與你的字符串比較恆定的名稱(strcmp()
  5. 如果參數數值(isdigit()sscanf(string, "%d", &parameter) > 0)將其轉換爲可用原語(atoi()atof()等或sscanf()
  6. 將params傳遞給你的函數。
+0

謝謝你,我認爲你的選擇c會對我有幫助。有沒有在C + +的方式? – johnkrishna 2012-01-31 10:20:51

+0

@johnkrishna在任何不支持反射的語言中,都無法做到這一點。如果你想做的話,你的c-like選項是Java,Objective-C或C#。或者你可以在c或C++中自己實現反射。 – 2012-01-31 15:42:14

+0

@whitlionV在這裏函數的參數將保持改變,在這種情況下如何識別類型(因爲strtok()將它們全部作爲字符串) – johnkrishna 2012-02-06 08:15:02

1

我不確定這是否爲標準,但您可以在C++中使用__PRETTY_FUNCTION__

如:

void foo(int a, int b) 
{ 
    cout << __PRETTY_FUNCTION__ << endl; 
} 

輸出:

void foo(int, int) 
+0

感謝您的編輯:) – NullPointer 2012-01-31 14:34:48

0

如果你想從一個字符串執行代碼(我只是猜測,你的問題是很難理解),則有許多選項可供選擇:將整個Clang和LLVM嵌入代碼中(並確保其JIT知道您將要導出的所有聲明)嵌入簡單的腳本語言(如Lua或Guile)併爲所有人提供包裝你想用這種方式調用的函數。

+0

雅我想執行的方法是在string.but這是在C/C++。正確理解我的問題看到這個http://stackoverflow.com/questions/9156389/how-to-parse-a-string-so-that-c​​ompiler-executes-the -statements-inside – johnkrishna 2012-02-06 08:08:25

+0

不,你的問題還很不清楚。而且,btw。'Clang'是一個C編譯器。你可能也想嘗試嵌入'tcc'(它是專門爲此目的而製作的),它比clang小得多,速度快。 – 2012-02-06 08:13:57

相關問題