0

除了破解一些体系结构/编译器相关的程序集之外,是否可以使用直接 C 或宏来执行类似的操作,并将可变长度数组展开 到参数列表中:

void myFunc (int a, int b, int c, int d);
void myOtherFunc (int a, int b);

/* try to call them */
int args[4] = { 1, 2, 3, 4 };
myFunc (SOME_MAGIC (args));

int otherArgs[2] = { 1, 2 };
myOtherFunc (SOME_MAGIC (otherArgs));

抱歉,如果这是重复的;基本上,我尝试过的搜索词的每一个变体都有一个关于在函数之间传递数组的问题,而不是弄乱函数堆栈。

可以假设传递给函数的参数计数将始终与原型匹配。否则,我想 argc/argv 风格的东西真的是唯一的方法吗?

另一个例子,希望有更多的上下文:

const struct func_info table[NUM_FUNCS] = {
    { foo,             1,  true  },
    { bar,             2,  true  },
    // ...
}

struct func_info fi = table[function_id];
int args* = malloc (fi->argc * sizeof (int));
for (int i = 0; i < fi->argc; i++) {
    args[i] = GetArgument (i);
}

fi->func (SOME_MAGIC (args));
4

1 回答 1

2

您可以使用宏来扩展 args。这是一种方法:

jim@jim-HP ~
$ cc smagic.c -o smagic

jim@jim-HP ~
$ ./smagic
a=1 b=2 c=3 d=4


#define SOME_MAGIC(args) args[0], args[1], args[2], args[3] 

int foo(int a, int b, int c, int d)
{
   printf("a=%d b=%d c=%d d=%d\n", a,b,c,d);
   return a;
}
int main(int argc, char **argv)
{
    int args[]={1,2,3,4};

    foo( SOME_MAGIC(args) );
    return 0;
}
于 2013-09-25T12:37:28.483 回答