Ожидаемый тип? Extern fn
Я не знаю ни C, ни Zig. Но я пробую кое-что, и я действительно впечатлен до сих пор. Я пытаюсь запустить веб-сервер в 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"?
Я даже не уверен, что делаю то, что должен делать. Если это не цель Зиг, просто дайте мне знать.
Еще одна вещь: 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 ответ
Вам нужно сделать так, чтобы ваша функция-обработчик имела соглашение о вызовах 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