Предположим, что список аргументов хранится как-то, например, в массиве.
Указатель функции, как я могу позвонить ему, передав сохраненный список аргументов?
Я не пытаюсь передать массив как аргумент ok. Вы поняли, хорошо? Я хочу передать каждый из его элементов в качестве аргумента. Массив просто для иллюстрации, я мог бы хранить аргументы в некоторой структуре кортежа. Кроме того, посмотрите, что у меня есть указатель на функцию и может иметь подпись в формате строки. Я не пытаюсь просто определить функцию, которая может работать с вариационным списком.
Единственный способ, которым я вижу, как это сделать, - использовать сборку (через __asm push
и др.) или это:
void (*f)(...);
int main()
{
f = <some function pointer>;
int args[]; <stored in a array, just to illustrate>
int num_args = <some value>;
switch(num_args)
{
case 0:
f();
break;
case 1:
f(args[0]);
break;
case 2:
f(args[0], args[1]);
break;
/* etc */
}
return 0;
}
Мне слишком не нравится этот подход...
Есть ли другая портативная и более короткая форма?
Несколько языков script могут вызывать функции C.
Как работают script языки, такие как Python или Ruby? Как они реализуют его переносимым образом? Они просто используют сборку для нескольких платформ или выше в конце?
Посмотрите, что я действительно не спрашиваю о деталях маршалинга параметров и других материалах от языков script до C, меня интересует только то, как, в конце концов, внутренний вызов функции C с помощью script.
ИЗМЕНИТЬ
Я сохраню заголовок вопроса, но я думаю, что лучший способ задать вопрос:
Как вызвать функцию C со своим указателем и сигнатурой, доступной только во время выполнения?
UPDATE
От Внешний интерфейс для схемы PLT:
Вызов - это вызов нормальной функции. В динамическом режиме, мы создаем объект "call-interface", который специфицирует (двоичный) типы ввода/вывода; этот объект можно использовать с произвольным указатель функции и массив входных значений для выполнения выноска функции и получения ее результата. Для этого требуется манипулируя стеком и зная, как называется функция, это детали, с которыми работает libffi.
Спасибо @AnttiHaapala за поиск, поиск и наведение libffi. Это то, что я искал, оно используется связкой языков script, это портативная библиотека, реализованная в нескольких архитектурах и компиляторах.