これは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))
ここで、2 つの質問があります。
これはすべてのプラットフォームで確実に動作しますか? Cでは、定義により、この状況の構造体は個々のパラメーターとまったく同じようにレイアウトされるため、これが機能することが保証されていると思いますが、よくわかりません。
構造体を返すのはどうですか?C関数を想定
mystruct foo();
libffi を使用せずに、Common Lisp から何らかの方法でこれを呼び出す可能性はありますか?たとえば、CFFI に戻り構造が必要とするメモリ量を伝え、それを手動で「解析」することはできますか?