-1

我有一个接受可变参数的 C 函数,我需要用很长的参数列表调用它,其中所有参数都遍历数组的元素。例子:

myFunction( A[0], B[0], A[1], B[1], A[2], B[2], A[3], B[3], ..... A[N], B[N] );

其中 N 通常为 100-200。

我宁愿不必每次使 N 变大时都手动构建此调用,并开始思考,有没有一种优雅的方法来做到这一点?

我试过类似的东西:

i=0;
myFunction( A[i], B[i++], A[i], B[i++], A[i], B[i++], A[i], B[i++], ..... A[i], B[++] );

但这当然失败了。然而,它更受欢迎的是,每当我使 N 变大时,我可以简单地一遍又一遍地复制同一行,而不必确保每个数组索引都是正确的,这非常乏味。

更改 myFunction() 不是一种选择。

我希望 C 有一种即时构造函数调用的方法,例如:

for( i = 0 ; i <= N ; i++ )
{
    CONSTRUCT_CALL( myFunction, A[i], B[i] );
}

这正是我想要的,但当然这不是一个选择。

有什么更容易或更优雅的吗?

非常感谢。

4

2 回答 2

2

没有标准的 C 方法可以做到这一点(在运行时合成可变参数调用)。但...

  • 您可以使用旨在处理此类问题的libffi (所以我推荐它)
  • 您可以考虑使用 GCC 特定的内置函数来构建调用
  • 您可以对 arity 有一些固定限制(例如 500),并使用一些(shell、awk.、Python、...)脚本生成一些 C 文件,该脚本switch 在 500 个案例上执行一个,每个 arity 一个。
  • 您可能会考虑在运行时生成一些 C 代码,将_gen123.c其编译为可动态加载的插件(例如gcc -shared -fPIC -Wall -O _gen123.c -o _gen123.so,在 Linux 上分叉一些命令),然后加载该插件(在 Linux 或 Posix 上使用dlopen(3) )
  • 你可能会考虑一些即时编译库(例如libjitllvm, GNU Lightningasmjit,...)

当然,避免i++一次调用多个。避免未定义的行为,因为可能会发生不好的事情

于 2014-09-16T12:02:23.423 回答
0

你的设计中有一些非常糟糕的地方。

重写你的myFunction,所以它需要两个数组(A 和 B),然后需要使用多个索引。

调用此类函数的简短示例:

int A[100];
int B[100];
int c = myFunction(A, B, 100);

一个可能的实现myFunction

int myFunction(int* A, int* B, int count)
{
    int result = 0;
    for(int j = 0; j < i; j++)
        result += A[j] + B[j]*2;

    return result;
}
于 2014-09-16T12:16:47.187 回答