首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我可以使用libcurls CURLOPT_WRITEFUNCTION和C++11 lambda表达式吗?

我可以使用libcurls CURLOPT_WRITEFUNCTION和C++11 lambda表达式吗?
EN

Stack Overflow用户
提问于 2011-07-08 12:50:20
回答 4查看 5.2K关注 0票数 11

我试着用C++11 lambda表达式表示CURLOPT_WRITEFUNCTION,但是程序在运行时崩溃,导致访问冲突。由于缺乏C++11知识,我不知道如何进一步研究这个问题,但也许其他人知道如何使其工作。

职能:

代码语言:javascript
复制
#ifndef CURL_GET_H
#define CURL_GET_H

#include <curl/curl.h>
#include <curl/easy.h>
#include <vector>
#include <string>

std::vector<std::string> curl_get(const char* url)
{
    CURL *curl;
    CURLcode res;

    std::vector<std::string> content;
    auto curl_callback = [](void *ptr, size_t size, size_t nmemb, void *stream) -> size_t {
        // does nothing at the moment due to testing...
        return size * nmemb;
    };

    curl = curl_easy_init();
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/aaa.txt");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_callback);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }

    return content;
}

#endif // CURL_GET_H

错误:

lpip_dl.exe: 0xC0000005: Zugriffsverletzung碑0x000000000000cc位置0x0000000000cc。 (在0x00000000000000cc位置违反访问权限)

当curl想要使用回调时发生:

代码语言:javascript
复制
wrote = data->set.fwrite_func(ptr, 1, len, data->set.out);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-02 06:47:08

libcurl是普通的C库,您需要设置可以从这样的库调用的回调。这意味着有趣的C++的事情需要“C‘化”的第一个工作。就像变成了一个老式的函数指针。

在libcurl常见问题条目"使用C++非静态函数进行回调?“中也提到了这一点。

另见:C++11中的C风格回调

票数 3
EN

Stack Overflow用户

发布于 2013-02-06 02:01:22

实际上,可以通过将lambda函数转换为函数指针来实现这一点。首先,您可以创建一个typedef,以使强制转换更容易。

代码语言:javascript
复制
typedef size_t(*CURL_WRITEFUNCTION_PTR)(void*, size_t, size_t, void*);

然后使用static_cast。

代码语言:javascript
复制
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, static_cast<CURL_WRITEFUNCTION_PTR>(curl_callback));

注意:为了转换为C函数指针,只能使用空捕获[]。

票数 8
EN

Stack Overflow用户

发布于 2020-12-02 11:45:29

这可以用+前缀来完成,它返回一个C风格的函数指针.但这只适用于无状态lambda(空捕获列表,即[])。

代码语言:javascript
复制
auto lambda = +[](void *ptr, size_t size, size_t nmemb, void *stream) -> size_t {
    // does nothing at the moment due to testing...
    return size * nmemb;
};

代码语言:javascript
复制
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, +[](void *ptr, size_t size, size_t nmemb, void *stream) -> size_t {
    // does nothing at the moment due to testing...
    return size * nmemb;
});
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6624667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档