From: Scott W. <or...@gm...> - 2003-06-17 00:13:19
|
If more than one foreign function has a user-defined struct for a return type, the C compiler gets confused. When the following file is compiled as a module: ----[ testffi.lisp ]------ (defpackage "TESTFFI" (:use "FFI" "COMMON-LISP")) (in-package "TESTFFI") (default-foreign-language :stdc) (def-c-struct type1 (arg1 int)) (def-call-out func1 (:return-type type1)) (def-call-out func2 (:return-type type1)) ---[ end testffi.lisp ]---- I get the following function definitions in the testffi.c file: extern struct TYPE1 { int ARG1; } (func1)(); extern struct TYPE1 { int ARG1; } (func2)(); which results in the following compiler error: testffi.c:14: redefinition of `struct TYPE1' make[1]: *** [testffi.o] Error 1 This problem does not occur if TYPE1 is only used in argument declarations. A possible solution is to output a struct TYPE1 { int ARG1; }; when the def-c-struct command is encountered, and then refer to that type as "struct TYPE1" instead of redeclaring the structure each time it is used. Another possible solution is to avoid naming the struct, which would result in the following code: extern struct { int ARG1; } (func1)(); extern struct { int ARG1; } (func2)(); which does not cause a compiler error. I don't know anything about the internal mechanisms clisp uses to generate code for the FFI, otherwise i'd fix it myself :o) I hope someone can resolve the issue! -Scott Williams -- +++ GMX - Mail, Messaging & more http://www.gmx.net +++ Bitte lächeln! Fotogalerie online mit GMX ohne eigene Homepage! |