gpt4 book ai didi

c++ - 我可以将 libcurls CURLOPT_WRITEFUNCTION 与 C++11 lambda 表达式一起使用吗?

转载 作者:可可西里 更新时间:2023-11-01 16:37:06 25 4
gpt4 key购买 nike

我尝试将 C++11 lambda 表达式与 CURLOPT_WRITEFUNCTION 结合使用,但程序在运行时因访问冲突而崩溃。由于缺乏 C++11 知识,我不确定如何进一步研究这个问题,但也许其他人知道如何进行这项工作。

函数:

#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

错误:

Unbehandelte Ausnahme bei 0x000000cc in lpip_dl.exe: 0xC0000005: Zugriffsverletzung bei Position 0x00000000000000cc.

(Access violation at position 0x00000000000000cc)

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

wrote = data->set.fwrite_func(ptr, 1, len, data->set.out);

最佳答案

您实际上可以通过将 lambda 函数转换为函数指针来实现。您可以先制作一个 typedef 以使转换更容易。

typedef size_t(*CURL_WRITEFUNCTION_PTR)(void*, size_t, size_t, void*);

然后你使用static_cast。

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, static_cast<CURL_WRITEFUNCTION_PTR>(curl_callback));

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

关于c++ - 我可以将 libcurls CURLOPT_WRITEFUNCTION 与 C++11 lambda 表达式一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6624667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com