将包含函数名称及其参数的字符串传递给另一个函数。

时间:2012-01-31 05:10:47

标签: c string function introspection

我想将字符串传递给C中的函数,其中函数将解析函数名称,函数的参数及其数据类型,然后为我调用函数。什么是最好的方法?

4 个答案:

答案 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或函数指针。有些东西:

  1. 以“function(var1,var2,...,varN)”
  2. 的形式获取字符串
  3. 获取函数的名称(即'(')
  4. 之前的所有内容
  5. 获取所有参数(例如strtok()
  6. 确定将常量名称与字符串(strcmp()
  7. 进行比较的函数
  8. 如果参数为数字(isdigit()sscanf( string, "%d", &parameter ) > 0),请将其转换为可用的原语(atoi()atof()等,或sscanf()
  9. 将params传递给你的功能。

答案 3 :(得分:0)

如果你想从字符串中执行代码(我只是猜测,你的问题很难理解),那么有很多选择:从将整个Clang和LLVM嵌入你的代码中(并确保它的代码) JIT知道你要导出的所有声明)嵌入一个简单的脚本语言(如Lua或Guile)并为你想用这种方式调用的所有函数提供包装。