我想将字符串传递给C中的函数,其中函数将解析函数名称,函数的参数及其数据类型,然后为我调用函数。什么是最好的方法?
答案 0 :(得分: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);
}
...
}
如果您有更具体的内容,请在您的问题中注明。
答案 1 :(得分:1)
我不确定这是否是标准的,但您可以在C ++中使用__PRETTY_FUNCTION__
。
e.g:
void foo(int a, int b)
{
cout << __PRETTY_FUNCTION__ << endl;
}
输出:
void foo(int, int)
答案 2 :(得分:0)
如果你想做:
char *funct = "foo(bar)";
实际调用函数foo()
,然后它不可能,C只是不起作用。我建议:
a)你坐下来重新考虑你的申请,因为任何事情都不需要这样的行为。
b)尝试具有此类功能的语言,例如objective-c
c)如果你真的,真的,真的想要这样做...然后创建一个字符串解析器和许多if或函数指针。有些东西:
strtok()
)strcmp()
)isdigit()
或sscanf( string, "%d", ¶meter ) > 0
),请将其转换为可用的原语(atoi()
,atof()
等,或sscanf()
)答案 3 :(得分:0)
如果你想从字符串中执行代码(我只是猜测,你的问题很难理解),那么有很多选择:从将整个Clang和LLVM嵌入你的代码中(并确保它的代码) JIT知道你要导出的所有声明)嵌入一个简单的脚本语言(如Lua或Guile)并为你想用这种方式调用的所有函数提供包装。