C++ C2664无法转换参数
我正在实现此代码,但收到一个错误 错误就在这段代码中C++ C2664无法转换参数,c++,curl,c2664,C++,Curl,C2664,我正在实现此代码,但收到一个错误 错误就在这段代码中 static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream) { curl_off_t nread; /* in real-world cases, this would probably get this data differently as this fread() stuff is exactly what the l
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
curl_off_t nread;
/* in real-world cases, this would probably get this data differently
as this fread() stuff is exactly what the library already would do
by default internally */
size_t retcode = fread(ptr, size, nmemb, stream);
nread = (curl_off_t)retcode;
fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
" bytes from file\n", nread);
return retcode;
}
错误是
IntelliSense: argument of type "void *" is incompatible with parameter of type "FILE *"
及
任何提示都是有用的。我不明白为什么我们要将void*流传递给函数。这到底是什么意思?指向空白的指针
这里叫它
/* we want to use our own read function */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
旋度API
CURLOPT_函数
将指针传递给与以下原型匹配的函数:
大小函数(void*ptr,size\t size,size\t nmemb,void
*用户数据);当libcurl需要读取数据以便将其发送给对等方时,它就会调用此函数。指向的数据区域
通过指针,ptr最多可填入乘以的大小
nmemb字节数。您的函数必须返回
存储在该内存区域中的字节。返回0将发出信号
结束文件到库并使其停止当前传输
如果您通过返回0“预到期”(即
在服务器预期它之前,比如当你说你将上传N
如果您上载的字节数小于N字节),您可能会遇到
服务器“挂起”等待其余的数据不会出现
读取回调可能返回CURL\u READFUNC\u ABORT以停止当前操作
操作立即执行,导致CURLE_按_中止_回调错误
传输代码(在7.12.1中添加)
从7.18.0开始,函数可以返回CURL\u READFUNC\u PAUSE,然后
将导致从此连接的读取暂停。看见
卷曲\u轻松\u暂停(3)了解更多详细信息
错误:在执行TFTP上载时,必须返回正确的
回调需要的数据,否则将被视为最终数据
数据包由服务器端发送,传输将在那里结束
如果将此回调指针设置为NULL,或者根本不设置它,则
将使用默认的内部读取功能。它正在做一个fread()的测试
文件*userdata集包含CURLOPT_READDATA
我有点不知所措。
fread
将文件*
作为其第四个参数,无效*
不匹配。假设stream的参数是一个文件*
,在将其传递给参数之前,您需要强制转换它:
fread(..., (FILE*)stream);
顺便说一句,reinterpret\u cast
在语义上更适合此任务:
fread(..., reinterpret_cast<FILE*>(stream));
fread(…,重新解释(stream));
void*
是一种通用指针类型,可转换为任何其他指针类型。如果您的程序是用C编写的,那么代码将是有效的,因为在C类型中void*
可以隐式转换为任何类型的指针。但是C++不允许隐式地将代码>代码>空>代码>转换为任何其他类型的指针。因此,您需要显式地将类型指定为要转换类型为void*
可以使用C样式铸件或C++风格铸件。比如说
size_t retcode = fread(ptr, size, nmemb, ( FILE * )stream);
或
size\u t retcode=fread(ptr,size,nmemb,reinterpret\u cast(stream));
fread
将文件*
作为其第四个参数,void*
不匹配。假设stream
的参数是文件*
,在将其传递给参数之前,您需要强制转换它:fread(…,(FILE*)stream)
@0x499602D2实际上将文件作为最后一个参数;不是第一次。cast分辨率显然仍然正确;只需移动它=P.@WhozCraig-Oops!谢谢你指出这一点。让我来解决这个问题。:)
size_t retcode = fread(ptr, size, nmemb, ( FILE * )stream);
size_t retcode = fread(ptr, size, nmemb, reinterpret_cast< FILE *>( stream ));