2016-05-13 91 views
6

比方说,我有一个函数:调用函数只在C运行时知道参数类型?

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

一个我想要实现的功能是能力,为用户呼吁通过Linux终端应用程序的任何功能。所以,作为软件的输入,在终端,他们键入类似:

foo 2 'a'

然后我的应用程序解析的是,使用符号表是能够找到的地址为foo(),还有键入所有参数。

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

任何提示没有数百个嵌套的if语句在调用函数之前将参数转换为正确的类型可以实现如何实现?

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

+1

所以你想建立你自己的C解释器?那么,从学习正式的语法,状态机,词法分析器,解析器和AST开始。 – Drop

+1

你会想做一些类型检查,以便如果用户写'foo'a'2',你可以避免用无效参数调用函数(这可能会导致程序崩溃)。这意味着您需要一种方法来在运行时表示值的类型,以及描述函数期望的类型的元数据,以及用于比较这两者的代码。此时,您基本上正在为[动态类型](https://en.wikipedia.org/w/index.php?title=Dynamic_typing)语言实施解释器。考虑使用*现有*动态类型的语言,如Python。 – Wyzard

+1

@Drop这个问题与解释C无关。它关于调用使用C调用约定的编译函数。 –

回答

3

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

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

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

0

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

+0

我已经能够检索到这些信息,这个问题与知道它的参数和类型后如何调用函数有关。 –

相关问题