时间:2010-07-23 18:07:27

标签: c function arguments

6 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

答案 2 :(得分:1)

答案 3 :(得分:1)

我会在这里发布与我在duplicated question发布的答案相同的答案,但你应该看看那里的讨论:

  

什么是libffi?

     

某些程序在编译时可能不知道要将哪些参数传递给函数。例如,可以在运行时告知解释器关于用于调用给定函数的参数的数量和类型。 'libffi'可用于此类程序,以提供从解释程序到编译代码的桥梁。

     

'libffi'库为各种调用约定提供了可移植的高级编程接口。这允许程序员在运行时调用由调用接口描述指定的任何函数。

     

FFI代表外部功能接口。外部函数接口是接口的流行名称,它允许用一种语言编写的代码调用用另一种语言编写的代码。 'libffi'库实际上只提供功能齐全的外部函数接口的最低机器相关层。一个图层必须存在于'libffi'之上,它处理两种语言之间传递的值的类型转换。

     

'libffi'假定您有一个指向您希望调用的函数的指针,并且您知道要传递它的参数的数量和类型,以及函数的返回类型。


历史背景

  最初由Anthony Green(SO用户:anthony-green)开发的libffi受到Silicon Graphics的Gencall库的启发。 Gencall由Gianni Mariani开发,然后由SGI雇用,目的是允许通过地址调用函数并为特定调用约定创建调用框架。安东尼格林改进了这个想法,并将其扩展到其他架构和召集会议以及开放采购libffi。


使用libffi

调用pow
#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;
}

我认为我可以断言libffi是一种可行的方式来做我所要求的,这与Antti Haapala断言没有这样的方式相反。如果我们不能将libffi称为便携式技术,考虑到它在编译器和体系结构中的移植/实现程度,以及哪个接口符合C标准,我们也无法将C或任何东西称为可移植技术。

从以下摘录中提取的信息和历史记录:

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

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

答案 4 :(得分:0)

答案 5 :(得分:0)