我试着用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
错误:
lpip_dl.exe: 0xC0000005: Zugriffsverletzung碑0x000000000000cc位置0x0000000000cc。 (在0x00000000000000cc位置违反访问权限)
当curl想要使用回调时发生:
wrote = data->set.fwrite_func(ptr, 1, len, data->set.out);
发布于 2011-09-02 06:47:08
libcurl是普通的C库,您需要设置可以从这样的库调用的回调。这意味着有趣的C++的事情需要“C‘化”的第一个工作。就像变成了一个老式的函数指针。
在libcurl常见问题条目"使用C++非静态函数进行回调?“中也提到了这一点。
另见:C++11中的C风格回调
发布于 2013-02-06 02:01:22
实际上,可以通过将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函数指针,只能使用空捕获[]。
发布于 2020-12-02 11:45:29
这可以用+前缀来完成,它返回一个C风格的函数指针.但这只适用于无状态lambda(空捕获列表,即[])。
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;
};
或
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;
});
https://stackoverflow.com/questions/6624667
复制相似问题