lisp - 如何创建对应于 C 宏的 Lisp FLI 函数

标签 lisp c-preprocessor common-lisp ffi lispworks

我想创建一个对应于 C 中的宏的 lisp 函数。 例如,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)

最佳答案

您不能直接这样做。 C 预处理器宏不会在编译过程中保留,即在生成的目标文件中根本没有工件,这将对应于 C 宏本身(尽管它的扩展可能多次成为目标文件的一部分)。由于没有工件,因此无需与 FFI 绑定(bind)。

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

#define HIGHWORD(x)     /* whatever */

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

并且这个可以与 FFI 一起使用。

关于lisp - 如何创建对应于 C 宏的 Lisp FLI 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40068960/

相关文章:

macros - 在 Lisp 中是否可以取消定义宏和函数?

Scheme:COND 在其主体中支持多个表达式的直觉是什么?

lisp - 通用 Lisp : getting an error using readtable-case

c - 全局数组或 "array"的 '#define' 的替代品?

C 预处理器:计算结构数组中的元素数

lisp - 如何在常见的 lisp 列表中找到最常见的元素?

lisp - 如何在 LISP 中列出从 1800 开始的所有闰年?

scheme - Racket 方案 - 从流中删除重复的连续字符

list - 方案过滤器 - "wrong value to apply: #f"

c++ - C++ 的有效用途包括守卫,好吧,包括守卫?