Bootstrap Dropdown в неправильном месте

@ Антти Хаапала указал на libffi . Вот некоторые сведения об этом:

Что такое libffi?

Некоторые программы могут не знать во время компиляции, какие аргументы должны быть переданы функции. Например, во время выполнения интерпретатору может быть рассказано о количестве и типах аргументов, используемых для вызова данной функции. «Libffi» может использоваться в таких программах, чтобы обеспечить мост от программы-интерпретатора до скомпилированного кода.

Библиотека libffi предоставляет портативный высокоуровневый программный интерфейс для различных соглашений вызова. Это позволяет программисту вызывать любую функцию, указанную в описании интерфейса вызова во время выполнения.

FFI означает интерфейс внешней функции. Интерфейс внешних функций - это популярное имя интерфейса, которое позволяет коду, написанному на одном языке, вызывать код, написанный на другом языке. Библиотека libffi действительно обеспечивает только самый низкий, зависящий от машины уровень полнофункционального интерфейса внешних функций. Уровень должен существовать над «libffi», который обрабатывает преобразования типов для значений, передаваемых между двумя языками.

«libffi» предполагает, что у вас есть указатель на функцию, которую вы хотите вызвать, и что вы знаете номер и типы аргументов для его передачи, а также возвращаемый тип функции.

blockquote>

Исторический фон

libffi, первоначально разработанный Энтони Грин (Пользователь SO: anthony-green ), был вдохновлен библиотекой Gencall от Silicon Graphics. Gencall был разработан Джанни Мариани, затем нанят SGI, чтобы разрешить вызовы функций по адресам и создать кадр вызова для конкретного соглашения о вызовах. Энтони Грин уточнил эту идею и распространил ее на другие архитектуры и вызывал соглашения и открывал источники libffi.

blockquote>

Вызов pow с libffi

#include 
#include 
#include 

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;
}

Я думаю, что могу утверждать, что libffi - это переносимый способ делать то, что я просил, вопреки утверждению Антти Хаапалы о том, что такого пути нет. Если мы не можем назвать libffi переносимой технологией, учитывая, насколько она портирована / реализована в разных компиляторах и архитектурах, а какой интерфейс соответствует стандарту C, мы также не можем назвать C или что-нибудь портативное.

Информация и история извлечены из:

https://github.com/atgreen/libffi/blob/master/doc/libffi.info

http://en.wikipedia.org/wiki/Libffi

13
задан fragilewindows 11 October 2016 в 21:13
поделиться