1

我不知道任何 C 或 Zig。但我正在尝试一些东西,到目前为止我真的印象深刻。我正在尝试使用 C 库“lwan”在 Zig 中运行 Web 服务器。有用。但是我在制作处理程序函数时遇到了一些麻烦。

/mnt/c/www/zig/hello/main.zig:35:56: error: expected type '?extern fn([*c].cimport:4:14.struct_lwan_request, [*c].cimport:4:14.struct_lwan_response, ?*c_void) .cimport:4:14.enum_lwan_http_status', found '*const fn([*c].cimport:4:14.struct_lwan_request, [*c].cimport:4:14.struct_lwan_response, ?*c_void) .cimport:4:14.enum_lwan_http_status'
        lwan.lwan_url_map{ .prefix = c"/", .handler = &hello_world },
                                                       ^
/mnt/c/www/zig/hello/main.zig:35:56: note: pointer type child 'fn([*c].cimport:4:14.struct_lwan_request, [*c].cimport:4:14.struct_lwan_response, ?*c_void) .cimport:4:14.enum_lwan_http_status' cannot cast into pointer type child '.cimport:4:14.enum_lwan_http_status'
        lwan.lwan_url_map{ .prefix = c"/", .handler = &hello_world },
                                                       ^
zig-cache/o/7Ejdc3DFhsEkPBHu2o3vlPoREApH2LmQtGmS7KyNIBhIeaHdzX6DwQhyzd5U7Eo0/cimport.zig:1234:35: note: .cimport:4:14.enum_lwan_http_status declared here
pub const enum_lwan_http_status = extern enum {

所以我猜我的处理函数的类型是错误的。这是我的处理程序:

fn hello_world(req: [*c]lwan.struct_lwan_request, res: [*c]lwan.struct_lwan_response, data: ?*c_void) lwan.enum_lwan_http_status {
    return lwan.enum_lwan_http_status.HTTP_OK;
}

如何将其更改为“?extern fn”类型?

我什至不确定我在做我应该做的事情。如果这不是 Zig 的目的,请告诉我。

还有一件事:lwan 使用以下代码创建处理程序:

#define LWAN_HANDLER_DECLARE(name_)                                            \
    static enum lwan_http_status lwan_handler_##name_(                         \
        struct lwan_request *, struct lwan_response *, void *)

#define LWAN_HANDLER_DEFINE(name_)                                             \
    static const struct lwan_handler_info                                      \
        __attribute__((used, section(LWAN_SECTION_NAME(lwan_handler))))        \
            lwan_handler_info_##name_ = {.name = #name_,                       \
                                         .handler = lwan_handler_##name_};     \
    static enum lwan_http_status lwan_handler_##name_(                         \
        struct lwan_request *request __attribute__((unused)),                  \
        struct lwan_response *response __attribute__((unused)),                \
        void *data __attribute__((unused)))

#define LWAN_HANDLER(name_)                                                    \
    LWAN_HANDLER_DECLARE(name_);                                               \
    LWAN_HANDLER_DEFINE(name_)

然后使用它来传递处理程序:

#define LWAN_HANDLER_REF(name_) lwan_handler_##name_
4

1 回答 1

2

您需要通过extern在其前面添加单词来使您的处理函数具有 C 调用约定:

extern fn hello_world(req: [*c]lwan.struct_lwan_request, res: [*c]lwan.struct_lwan_response, data: ?*c_void) lwan.enum_lwan_http_status {
    return lwan.enum_lwan_http_status.HTTP_OK;
}

另请参阅此相关问题,这可能有助于澄清语法:https ://github.com/ziglang/zig/issues/661

于 2019-07-06T18:27:37.783 回答