libcurl curl_easy_stopt long参数未正确传递-varg(param,long)

libcurl curl_easy_setopt long param not passed correctly - va_arg(param, long)

本文关键字:long -varg param easy curl stopt 参数 libcurl      更新时间:2023-10-16

任何一位可能对此有所了解的libcurl专家?

我注意到这一点是因为我无法关闭libcurl VERBOSE:

curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);

当我通过对libcurl的调用进行跟踪时,我发现0L(long)被转换为一个非零数字,导致VERBOSE始终打开。我还没有尝试过,但我很确定任何长参数都不会正确传递。

data->set.verbose = (0 != va_arg(param, long))?TRUE:FALSE;

其中

#define va_arg _crt_va_arg
#define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

但我不确定这些人在干什么
为什么会发生这种情况,以及如何解决?

我使用的是带有libcurl 7.27.0 的Visual Studio 2010 C++

va_arg()正在使用指针算术va_list param中提取0L。您可以在此处或此处阅读有关va_list类型的更多信息。将0L转换为非零数字不是。

请尝试在打开连接之前调用curl_easy_stopt()。该文档指出,您的详细设置是"为多个独立连接设置一次"(urldata.h ln 1537)。

如果您仍然不相信它有效,您可以将CURL*转换为SessionHandle*并在调试器中检查它,例如:

struct SessionHandle *data = reinterpret_cast<SessionHandle*>(curl);
// Inspect data->set.verbose

您可以在urldata.h中找到SessionHandle的定义。

相关文章: