2013-09-25 2 views
0

Помимо от взлома какой-либо архитектуры или компилятора, зависит от сборки, можно ли сделать что-то подобное с помощью прямого C или макроса и развернуть переменную длину массив в списке аргументов:Использование массива в качестве аргументов функции в C (обратные varargs)

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)); 

ответ

2

Вы можете использовать макросы для расширения арг. Вот один из способов:

[email protected] ~ 
$ cc smagic.c -o smagic 

[email protected] ~ 
$ ./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; 
} 
+0

Это работает только до тех пор, пока функция всегда принимает 4 аргумента. Длина аргумента может быть переменной. – halex

+0

@haley И как вы собираетесь определить, сколько аргументов имеет функция? – this

+0

@jim mcnamara Это приятное решение, еще один макро-трюк, который я могу запомнить. – this

Смежные вопросы