首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建与C宏对应的Lisp函数

如何创建与C宏对应的Lisp函数
EN

Stack Overflow用户
提问于 2016-10-16 09:48:22
回答 2查看 200关注 0票数 3

我想要创建一个lisp函数,它对应于C中的一个宏,例如,在win32 API中有一个HIWORD,它被定义为头文件中的宏。

我试图将其定义如下,但有人告诉我,HIWORD尚未解决。

代码语言:javascript
复制
CL-USER 4 > (hiword #xFFFFFFFF)
Error: Foreign function HIWORD trying to call to unresolved external function "HIWORDW".

我只想知道如何为C宏创建一个包装器,就像C函数一样。

代码语言:javascript
复制
(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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-17 04:47:31

没必要跳进另一种语言。在Lisp中移动和掩蔽:

代码语言:javascript
复制
(defun hiword (val)
  (logand (ash val -16) #xFFFF)

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

另一种方法:使用具有使用ldb语法表示的范围的byte访问器:

代码语言:javascript
复制
(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.
票数 6
EN

Stack Overflow用户

发布于 2016-10-16 10:08:36

你不能直接这么做。在编译过程中不保留C预处理宏,即生成的对象文件中根本没有工件,这将与C宏本身相对应(尽管它的展开可能多次是对象文件的一部分)。由于没有人工制品,所以没有什么可与FFI绑定的。

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

代码语言:javascript
复制
#define HIGHWORD(x)     /* whatever */

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

这个可以和FFI一起使用。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40068960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档