【问题标题】:C late binding with unknown arguments带有未知参数的 C 后期绑定
【发布时间】:2016-01-19 19:58:50
【问题描述】:

我目前处于需要调用大量在运行时提取的函数指针的情况。问题是参数在编译时是未知的。

但是,在运行时,我收到的数据可以让我知道函数的参数,我什至可以将参数存储在 char* 数组中。问题是我没有函数指针模型可以将其转换为。

在高级语言中,我知道有像“InvokeMethode(String name,Byte[] args)”这样的函数,可以像参数一样解释字节数组。由于 C 中不存在反射,因此我不希望通过函数指针看到这一点。

我想到的一个解决方案(它真的很糟糕)是在编译时创建一个函数指针模型,它将以“硬编码方式”将 ptr 转换为正确的类型,以便像这样使用:

void callFunc64Bits(void* funcPtr,long long args);
void callFuncVoid(void* funcPtr);

问题是我必须创建像这样的 100 个函数来正确转换指针。

有没有办法更有效地做到这一点?

非常感谢!

【问题讨论】:

  • 所以把所有的函数都作为参数void*,开心就好..
  • 好吧,我不是编写需要以动态方式加载的函数的人
  • 那么,恐怕现在有办法做到这一点,除非你传递有关参数类型的信息,然后制作一个包装器来调用函数。
  • 您需要创建 API 或协议(标准或其他)。描述函数参数。并构建解析参数并将它们传递给函数的工具(与 Web 服务相同的方式,例如:WSDL),另一个工作示例是 printf 解析其参数的方式)
  • 我已经有了第一部分(函数参数说明)。我不明白我该怎么做第二部分。如果我在编译时没有为它们编写演员表,如何将我的数据传递给函数。谢谢!编辑:感谢您提供 printf 示例。

标签: c dynamic binding function-pointers


【解决方案1】:

不幸的是,这是一个难题,没有好的或简单的答案。

查看以前的 SO 问题:Run-time parameters in gcc (inverse va_args/varargs)

请参阅此 C 常见问题解答问题:http://c-faq.com/varargs/invvarargs.html

请参阅 C FAQ 列表维护者收集的“古怪想法”:http://c-faq.com/varargs/wacky.html


附录:查看之前的 SO 问题:How to call functions by their pointers passing multiple arguments in C?

...其中提到“libffi”:http://sourceware.org/libffi/

【讨论】:

  • libfii 对我来说似乎是一个很好的问题解决者。我正在等待更多答案,但这可能是最终的解决方案。谢谢!!
猜你喜欢
  • 2011-02-17
  • 1970-01-01
  • 2014-11-25
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2011-08-29
  • 1970-01-01
相关资源
最近更新 更多