调用函数只知道C中运行时的参数类型?

时间:2016-05-13 04:39:56

标签: c

假设我有一个功能:

int foo (int A, char B){...}

我想要实现的功能之一是用户可以通过Linux终端调用应用程序上的任何功能。因此,作为软件的输入,在终端中输入类似的内容:

foo 2 'a'

然后我的应用程序解析它,并使用符号表,它能够找到foo()的地址,以及其所有参数的类型。

但是,我不确定在调用它时如何将参数传递给函数,因为根据所调用的函数,我可以有数百种不同的参数类型组合。

如果没有数百个嵌套的if语句在调用函数之前将参数强制转换为正确的类型,那么如何才能实现?

该功能类似于GDB所具有的功能,您可以在其中执行call foo(2,'a')以及对您有用的GDB调用。

2 个答案:

答案 0 :(得分:3)

这有两种方法。如果您所描述的只是您想要做的,那么您可以使用dyncall library,这样您就不必担心自己的平台/编译器特定的调用语义:

  

dyncall库从左到右封装虚拟绑定参数参数中的体系结构,OS和编译器特定的函数调用语义,然后调用接口,允许程序员以完全动态的方式调用C函数。换句话说,dyncall库不是直接调用函数,而是提供了一种手动推送函数参数并在之后发出调用的机制。

另一种方法是,如果您可能想要做更多:例如:如果一个参数不能由文字创建怎么办?如果参数是另一个函数的输出怎么办?你能在控制台中写f(123, g("a"))吗?你能写x=g("a"); f(x)吗? if(cond) x="a" else x="b"; f(x)在这种情况下,您需要嵌入脚本语言,例如: LUA。

答案 1 :(得分:0)

如果使用调试信息编译二进制文件,可以使用libdwarf(https://www.prevanders.net/dwarf.html)对其进行提取,因此对于每个函数,您都可以获得一个带有类型的参数列表,并且您将知道如何解释用户的输入。 / p>