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