vak: (Default)
[personal profile] vak
Наверное вы знаете, что в юниксе есть такой системный вызов execv(), который выполняет нужный файл с произвольным списком параметров. Вот таким макаром:
int execv(const char *path, char *const argv[]);
А мне нужно нечто похожее, но чтобы вызвать функцию (по указателю) с произвольным списком аргументов. Что-то вроде:
void call(void (*func)(...), int *argv[]);
Функция определена где-то как обрабатывающая фиксированный набор параметров. К примеру, это может быть:
void add(int *a, int *b, int *c)
{
*c = *a + *b;
}
У меня есть указатель на функцию, и массив параметров, количество которых заранее не фиксировано. Хотелось бы вызвать некую функцию call(), которая бы положила нужные параметры на стек и вызвала функцию:
call(func, argv);
Может такое есть уже где-то, а я просто не в курсе?

Date: 2021-02-12 09:52 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Как вызов делается, откуда? Рукописный C-код? Сгенерированная хрень?
Какова однородность типов аргументов?
Какую проблему решаем?

А то можно же было бы в самом простом случае собирать аргументы в массив и евоный адрес передавать.
А массив – можно фиксированного размера, а можно через malloc(). А можно и VLA (хотя, лучше избегать).
Через ... и va_arg() тоже можно. Даже разнообразное.
Но нужно или число аргументов, или признак конца, или ещё что-то, если нет фиксированной схемы.

А можно ещё прикол типа чтобы функция возвращала указатель на функцию... Тогда можно паровозик с вагончиками: f(1)(2)(3)(4). Но это больше для прикола. Разницы между разделением запятыми и скобками не много.

Ещё были трюк, где макрос считал число аргументов.

Занятные вещи, которые могут не пригодится, на пофантазировать:
https://en.cppreference.com/w/c/language/generic
https://en.cppreference.com/w/c/language/compound_literal