Я опубликую здесь тот же ответ, который я написал на дублирующем вопросе , но вы должны взглянуть на обсуждение там:
Что такое libffi?
Некоторые программы могут не знать во время компиляции, какие аргументы должны быть переданы функции.Например, интерпретатору можно сообщить во время выполнения о количестве и типах аргументов, используемых для вызова данной функции.«libffi» может использоваться в таких программах для обеспечения моста между программой-интерпретатором и скомпилированным кодом.
Библиотека «libffi» предоставляет переносимый высокоуровневый программный интерфейс для различных соглашений о вызовах.Это позволяет программисту вызывать любую функцию, указанную в описании интерфейса вызова во время выполнения.
FFI означает Интерфейс внешней функции.Интерфейс сторонней функции - это популярное имя интерфейса, которое позволяет коду, написанному на одном языке, вызывать код, написанный на другом языке.Библиотека 'libffi' действительно предоставляет только самый нижний, машинно-зависимый уровень полнофункционального интерфейса сторонних функций.Слой должен существовать выше «libffi», который обрабатывает преобразования типов для значений, передаваемых между двумя языками.
«libffi» предполагает, что у вас есть указатель на функцию, которую вы хотите вызвать, и что вы знаете число и типыаргументов для его передачи, а также тип возвращаемого значения функции.
Исторический фон
libffi, первоначально разработанный Энтони Грин (пользователь SO: anthony-green ), вдохновлено библиотекой Gencall из Silicon Graphics.Gencall был разработан Джанни Мариани, который затем работал в SGI, с целью разрешения вызовов функций по адресу и создания кадра вызова для конкретного соглашения о вызовах.Энтони Грин усовершенствовал идею и распространил ее на другие архитектуры, соглашения о вызовах и открытый доступ к libffi.
Вызов pow с помощью libffi
#include <stdio.h>
#include <math.h>
#include <ffi.h>
int main()
{
ffi_cif call_interface;
ffi_type *ret_type;
ffi_type *arg_types[2];
/* pow signature */
ret_type = &ffi_type_double;
arg_types[0] = &ffi_type_double;
arg_types[1] = &ffi_type_double;
/* prepare pow function call interface */
if (ffi_prep_cif(&call_interface, FFI_DEFAULT_ABI, 2, ret_type, arg_types) == FFI_OK)
{
void *arg_values[2];
double x, y, z;
/* z stores the return */
z = 0;
/* arg_values elements point to actual arguments */
arg_values[0] = &x;
arg_values[1] = &y;
x = 2;
y = 3;
/* call pow */
ffi_call(&call_interface, FFI_FN(pow), &z, arg_values);
/* 2^3=8 */
printf("%.0f^%.0f=%.0f\n", x, y, z);
}
return 0;
}
Я думаюcan assert libffi - это портативный способ сделать то, что я просил, вопреки утверждению Антти Хаапалы, что такого способа нет.Если мы не можем назвать libffi переносимой технологией, учитывая, насколько она портирована / реализована в компиляторах и архитектурах и какой интерфейс соответствует стандарту C, мы тоже не можем назвать C или что-то еще переносимым.
Информация и история извлечены из:
https://github.com/atgreen/libffi/blob/master/doc/libffi.info
http://en.wikipedia.org/wiki/Libffi