预期类型?extern fn

时间:2019-06-22 18:59:32

标签: zig

我不知道任何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_

1 个答案:

答案 0 :(得分:0)

您需要通过在其前面添加单词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