在C中使用数组作为函数参数(反向变量)

时间:2013-09-25 12:08:43

标签: c arrays variadic-functions

除了黑客攻击一些架构/编译器相关的程序集,是否可以使用直接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));

1 个答案:

答案 0 :(得分: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;
}