这是对Common lisp, CFFI, and instantiating c structs问题的跟进,所以基本上这个问题是关于使用 CFFI 从 Common Lisp 向堆栈上的 c 函数传递和返回 c 结构。
上面链接的问题的答案(从 2010 年开始)是不可能的。
当前版本的 CFFI 支持通过 libffi 在堆栈上传递和返回结构,如本问题中所述。但是,libffi 引入了另一个依赖项,并且 libffi 在我所针对的所有系统上进行编译并非易事。因此我尽量不使用 libffi,因为我只有很少的这样的函数可以调用。
正如我链接到的第一个问题中所讨论的,可以通过解构结构来调用期望堆栈上的结构参数的 c 函数。例如,这是一个结构和一个函数定义:
typedef struct
{
int width;
int height;
bool isGreat;
} mystruct;
int do_something(mystruct rect);
可以使用 Common Lisp 调用此函数
(cffi:defcfun ("do_something" do-something)
:int
(width :int)
(height :int)
(is-great :boolean))
现在,我有两个问题:
这确定适用于所有平台吗?我会假设在 C 中,根据定义,这种情况下的结构的布局与各个参数的布局完全相同,因此这可以保证工作,但我不确定。
返回结构呢?假设一个 C 函数
mystruct foo();
是否有可能在不使用 libffi 的情况下从 Common Lisp 以某种方式调用它,例如通过告诉 CFFI 返回结构将占用多少内存,然后手动“解析”它?