我必须从pow
库加载函数(从sin
或so
获取恒定数量的参数)并使用命令行中给出的参数执行它。在命令行参数中也给出了库和函数的名称。此外,我有一个字符串编码参数和它们的类型,例如“ii”表示两个整数。所以我可以使用dlopen()
加载这个库并使用dlsym
加载函数,但是我无法想象如何在执行之前将所有参数传递给此函数,而它们的编号是未知的。
答案 0 :(得分:2)
C支持vararg调用,其中变量部分由函数声明中的椭圆表示。它在7.15标准的变量参数中定义。这是C的一个相当模糊的部分,但在标准库中大量用于*printf
和*scanf
函数系列,以及execl
函数。
这是晦涩的恕我直言,因为你需要一些魔法来猜测实际传递了什么参数。对于*printf
和*scanf
,您依赖格式字符串来声明,对于execl
,您假设它是一个C字符串列表(空终止的字符数组),以空指针。
这种调用适用于调用者知道参数数量的用例(再次考虑*printf
)。如果参数的数量在运行时可能会有所不同,例如命令行参数,则数组更合适。毫不奇怪,main
函数将其参数列表作为数组+数组长度接收。如果你希望能够将命令行参数传递给另一个函数(无论是否在dll中),只需模仿它并传递一个数组,或者将其长度作为另一个参数传递,或者使用约定来终止它。空指针。
答案 1 :(得分:1)
关于可能的输入参数集的switch语句将允许您调用库。类似的东西:
switch(param) {
PARAM_II: rc = (*func)(int1, int2);
break;
...
}