3

我想创建一个 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)
4

2 回答 2

7

您不能直接执行此操作。C 预处理器宏不会在编译过程中保留,即在生成的目标文件中根本没有工件,这将对应于 C 宏本身(尽管它的扩展可能多次成为目标文件的一部分)。而且由于没有工件,因此没有任何东西可以与 FFI 绑定。

但是,您可以提供包装函数

#define HIGHWORD(x)     /* whatever */

int 
highword_wrapper(int x)
{
    return HIGHWORD(x);
}

这个可以和FFI一起使用。

于 2016-10-16T10:08:36.790 回答
6

No need to jump into another language. Shifting and masking in Lisp:

(defun hiword (val)
  (logand (ash val -16) #xFFFF)

(defun loword (val) ;; ditto
  (logand val #xFFFF))

Another way: using the ldb accessor with ranges expressed using byte syntax:

(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-17T04:47:31.047 回答