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 08:39 (UTC)
From: [personal profile] permeakra
Интринсиков в С для этого нет, потому что это ABI-зависимо. А у нас теоретически даже на одной платформе могут существовать функции с разными ABI Если у вас есть контроль над интерфейсом вызываемых функций, то проще всего сделать так, чтобы они принимали указатель на структуру с аргументами и вызывать их через указатели void* (*)(void*). А если нет, то для работы со стеком нужна библиотека, абстрагирующая детали платформы. напр. libffi, в которой для этого самого есть платформо- и ABI-специфичные асмовые вставки.
Edited Date: 2021-02-12 08:42 (UTC)