【问题标题】:What is libcurl doing with the third parameter on curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, function) in Clibcurl 用 C 中 curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, function) 上的第三个参数做什么
【发布时间】:2020-11-10 20:39:14
【问题描述】:

我正在做一个从 api 获取数据的简单程序,并按照文档创建一个回调函数以传递给 curl_easy_setopt:

size_t callback_libcurl(void *contents, size_t size, size_t nmemb, void *userp) {                                                                                   
        size_t realsize = size * nmemb;                                                                                                                                   
        struct resultado *mem = (struct resultado *)userp;                                                                                                                
                                                                                                                                                                      
        char *ptr = realloc(mem->dados, mem->tamanho + realsize + 1);                                                                                                     
        if(ptr == NULL) {                                                                                                                                                                                                                                                                                           
              printf("not enough memory (realloc returned NULL)\n");                                                                                                          
              return 0;                                                                                                                                                       
}

然后将其传递给:

curl_easy_setopt(handler_curl, CURLOPT_WRITEFUNCTION, callback_libcurl);

一切正常,但我不知道为什么。我如何将回调函数传递给 curl 函数?
文档说参数可以是 long、函数指针、对象指针或 curl_off_t。 这不是那个afaik。
我能找到的唯一来源是:

CURL_EXTERN CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);

在 /curl/easy.h 上,但这也无济于事,我不知道 ... 是什么。在上面找不到任何东西。
我错过了什么?

【问题讨论】:

    标签: c curl libcurl


    【解决方案1】:

    文档说参数可以是 long、函数指针、对象指针或 curl_off_t。完全不是这样的。

    在 C 中,函数会在适当的时候自动衰减为函数指针。所以以下是等价的:

    curl_easy_setopt(handler_curl, CURLOPT_WRITEFUNCTION, callback_libcurl);
    curl_easy_setopt(handler_curl, CURLOPT_WRITEFUNCTION, &callback_libcurl);
    

    因此,您正在传递一个函数指针,一个指向callback_libcurl

    【讨论】:

    • 找到另一个答案:“...确定每个参数的类型后,将任何类型为“T数组”或“函数返回T”的参数调整为“指向T的指针”或“指向返回 T 的函数的指针”,分别来自 c++ (?) 标准。我想这就解决了,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2013-10-12
    • 2012-05-04
    相关资源
    最近更新 更多