Помимо от взлома какой-либо архитектуры или компилятора, зависит от сборки, можно ли сделать что-то подобное с помощью прямого 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));
Это работает только до тех пор, пока функция всегда принимает 4 аргумента. Длина аргумента может быть переменной. – halex
@haley И как вы собираетесь определить, сколько аргументов имеет функция? – this
@jim mcnamara Это приятное решение, еще один макро-трюк, который я могу запомнить. – this