我想要创建一个lisp函数,它对应于C中的一个宏,例如,在win32 API中有一个HIWORD,它被定义为头文件中的宏。
我试图将其定义如下,但有人告诉我,HIWORD尚未解决。
CL-USER 4 > (hiword #xFFFFFFFF)
Error: Foreign function HIWORD trying to call to unresolved external function "HIWORDW".我只想知道如何为C宏创建一个包装器,就像C函数一样。
(fli:define-c-typedef DWORD (:unsigned :long))
(fli:define-c-typedef WORD (:unsigned :short))
(fli:define-foreign-function
(HIWORD "HIWORD" :dbcs)
((dwVal dword))
:result-type word :calling-convention :stdcall)发布于 2016-10-17 04:47:31
没必要跳进另一种语言。在Lisp中移动和掩蔽:
(defun hiword (val)
(logand (ash val -16) #xFFFF)
(defun loword (val) ;; ditto
(logand val #xFFFF))另一种方法:使用具有使用ldb语法表示的范围的byte访问器:
(defun hiword (val)
(ldb (byte 16 16) val) ;; get 16-bit-wide "byte" starting at bit 16.
(defun loword (val)
(ldb (byte 16 0) val) ;; get 16-bit-wide "byte" at position 0.发布于 2016-10-16 10:08:36
你不能直接这么做。在编译过程中不保留C预处理宏,即生成的对象文件中根本没有工件,这将与C宏本身相对应(尽管它的展开可能多次是对象文件的一部分)。由于没有人工制品,所以没有什么可与FFI绑定的。
但是,您可以提供一个包装器函数。
#define HIGHWORD(x) /* whatever */
int
highword_wrapper(int x)
{
return HIGHWORD(x);
}这个可以和FFI一起使用。
https://stackoverflow.com/questions/40068960
复制相似问题