Ожидаемый тип? Extern fn - PullRequest
       79

Ожидаемый тип? Extern fn

1 голос
/ 22 июня 2019

Я не знаю ни Си, ни Зиг.Но я пробую кое-что, и я действительно впечатлен до сих пор.Я пытаюсь запустить веб-сервер в Zig, используя библиотеку C "lwan".Оно работает.Но у меня возникли некоторые проблемы с настройкой функции обработчика.

/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 голосов
/ 06 июля 2019

Вам нужно, чтобы ваша функция-обработчик имела соглашение о вызовах C, добавив перед ним слово extern:

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

...