首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在cffi中发送NULL as :string

如何在cffi中发送NULL as :string
EN

Stack Overflow用户
提问于 2022-03-09 12:25:07
回答 1查看 83关注 0票数 1

我试图使用lisp端的wayland,这是我的代码:

代码语言:javascript
复制
(define-foreign-library wayland-client
  (:unix (:or "libwayland-client.so.0.20.0" "libwayland-client.so"))
  (t (:default "libwayland-client")))


(use-foreign-library wayland-client)

(defcfun "wl_display_connect" :pointer
  (name :string))

(wl-display-connect (null-pointer));;return NULL

C中的代码,来自这里

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <wayland-client.h>

struct wl_display *display = NULL;

int main(int argc, char **argv) {

    display = wl_display_connect(NULL);
    if (display == NULL) {
    fprintf(stderr, "Can't connect to display\n");
    exit(1);
    }
    printf("connected to display\n");

    wl_display_disconnect(display);
    printf("disconnected from display\n");    
    exit(0);
}

我已经测试了C语言,它起作用了,lisp的测试应该如何正确?

wl_display_connect是如何从这里定义的

代码语言:javascript
复制
struct wl_display* wl_display_connect(const char *name)
EN

回答 1

Stack Overflow用户

发布于 2022-03-10 12:11:12

我不是CFFI方面的专家,但我认为诀窍是说事情是(:pointer :char)s而不是:strings。

代码语言:javascript
复制
#include <stdio.h>

char *ts(char *x) {
  if (x == NULL) {
    printf("Got a null\n");
  }
  return x;
}

而这份CFFI声明:

代码语言:javascript
复制
(defcfun (ts "ts")
    (:pointer :char)
  (name (:pointer :char)))

那么,这将是可行的:

代码语言:javascript
复制
> (null-pointer-p (ts (null-pointer)))
Got a null
t

然后,您可以使用外部字符串调用它,但是您需要处理分配和释放它们:(ts "foo")不能工作。但这将:

代码语言:javascript
复制
(defun ts-wrapper (s)
  (with-foreign-string (x s)
    (foreign-string-to-lisp (ts x))))

现在:

代码语言:javascript
复制
> (ts-wrapper "foo")
"foo"
3

显然,在您的情况下,您不需要处理来自外部字符串的转换。

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

https://stackoverflow.com/questions/71409336

复制
相关文章

相似问题

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