2012-01-31 43 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

相关问题