如何将objective-c函数作为回调函数传递给C函数?

ahm*_*med 3 c macos cocoa objective-c ios

我想从objective-c调用ac函数并将objective-c函数作为回调传递

问题是这个函数有一个回调作为参数,所以我必须将objective-c函数作为回调函数传递给c函数

这是c函数的标题

        struct mg_context *mg_start(const struct mg_callbacks *callbacks,
                        void *user_data,
                        const char **configuration_options);
Run Code Online (Sandbox Code Playgroud)

这是我试图称之为的地方

- (void)serverstarted
{
    NSLog(@"server started");
}


- (IBAction)startserver:(id)sender {
   NSLog(@"server should start");
   const char *options[] =
   {
       "document_root", "www",
       "listening_ports", "8080",
        NULL
   };
   mg_start(serverstarted(), NULL, options);
  }
Run Code Online (Sandbox Code Playgroud)

我已经尝试了几种方法来搜索网页,只是想知道如何做到这一点,但没有运气

这是我在代码中包含的库

https://github.com/valenok/mongoose

mat*_*att 5

你的主要问题是第一个参数mg_start(),在声明中描述为const struct mg_callbacks *callbacks.您正在尝试传递指向函数的指针.(实际上你试图将调用的结果传递给该函数,这更远离标记.)这不是它所说的:它表示指向结构的指针(特别是mg_callbacks结构).

https://github.com/valenok/mongoose/blob/master/examples/hello.c上的示例代码向您展示了如何配置此结构.您必须创建结构并将指针放入其中的回调函数.然后传递该结构的地址.

您的代码的其他问题:您的回调函数本身都是错误的:

- (void)serverstarted
{
    NSLog(@"server started");
}
Run Code Online (Sandbox Code Playgroud)

这里需要的是一个像这样声明的C函数:int begin_request_handler(struct mg_connection *conn)也就是说,它将一个指向mg_connection结构的指针作为参数.你serverstarted不仅不接受那个参数,它甚至不是C函数!这是一种Objective-C方法,一种完全不同的动物.您在标题和问题中使用"Objective-C函数"一词具有误导性; C有函数,Objective-C有方法.没有Objective-C将用于您将在此处编写的代码中.

我建议你在这里做的是首先盲目复制这个hello.c例子.然后慢慢地逐步修改事物的内容/名称,以将其演变为您自己的代码.当然学习C也会有所帮助,但你可以通过仔细复制来获得.