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