1

在研究 Wayland 协议时,我发现函数以 struct 类型作为参数的代码。

#include <wayland-server.h>    
static struct wl_compositor_interface compositor_interface =
        {&compositor_create_surface, &compositor_create_region};

    int main() {
        wl_global_create (display, &wl_compositor_interface, 3, NULL, 
                          &compositor_bind);
    }

wl_global_create 的签名是

struct wl_global* wl_global_create  (struct wl_display *display,
                                     const struct wl_interface *interface,
                                     int    version,
                                     void *data,
                                     wl_global_bind_func_t bind)

wl_compositor_interface 是结构类型,而不是变量名。但是 wl_global_create() 将结构类型作为函数参数。有人可以解释这是如何工作的吗?

我读的源代码在这里。https://github.com/eyelash/tutorials/blob/master/wayland-compositor/wayland-compositor.c

4

1 回答 1

1

我浏览了源代码,并且有 astruct wl_compositor_interface和 a variable wl_compositor_interface

包括wayland_server.h在底部的wayland-server-protocol.h. 不幸的是,这不是在线可用的,而是在构建时生成的。您可以通过以下方式获得它:

$ git clone git://anongit.freedesktop.org/wayland/wayland
$ cd wayland
$ mkdir prefix
$ ./autogen.sh --prefix=$(pwd)/prefix --disable-documentation
$ make protocol/wayland-server-protocol.h

在这个文件中,它有(有些令人困惑的)定义:

extern const struct wl_interface wl_compositor_interface; // On line 195
...
struct wl_compositor_interface { // Starting on line 986
    void (*create_surface)(struct wl_client *client,
                   struct wl_resource *resource,
                   uint32_t id);

    void (*create_region)(struct wl_client *client,
                  struct wl_resource *resource,
                  uint32_t id);
};

这是struct第一次被引用的那个,第二次被引用的是变量。

于 2017-05-21T22:22:53.050 回答