Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C和C+之间的va#U列表是否不兼容+;?_C++_C_Visual Studio_Variadic Functions - Fatal编程技术网

C++ C和C+之间的va#U列表是否不兼容+;?

C++ C和C+之间的va#U列表是否不兼容+;?,c++,c,visual-studio,variadic-functions,C++,C,Visual Studio,Variadic Functions,我使用的是一个库(gnumicrohttpdaemon),它通过一个接受va_列表的回调传递错误消息。我传入一个函数指针,如果发生错误,则使用va_列表和一些其他参数调用我的函数。我的问题是,当我收到va_列表时,它是垃圾,试图使用它会导致抛出异常。 我正在Windows 10上使用Visual Studio 2015。MicroHttpDaemon是使用相同的编译器构建的。我对这个原因的最佳猜测是MyHtpDaEon是用C编写的,但是我使用C++。有人能证实这就是问题所在吗?如果是这样,我能做

我使用的是一个库(gnumicrohttpdaemon),它通过一个接受va_列表的回调传递错误消息。我传入一个函数指针,如果发生错误,则使用va_列表和一些其他参数调用我的函数。我的问题是,当我收到va_列表时,它是垃圾,试图使用它会导致抛出异常。 我正在Windows 10上使用Visual Studio 2015。MicroHttpDaemon是使用相同的编译器构建的。我对这个原因的最佳猜测是MyHtpDaEon是用C编写的,但是我使用C++。有人能证实这就是问题所在吗?如果是这样,我能做什么来把这些参数放入我的C++代码中? 我的回电在下面,以防万一。请注意,它是一个静态方法,所以我认为通常可以用作C回调

void HttpDaemon::parseMessageVa(void * arg, const char * fmt, va_list &ap)
{
    HttpDaemon *daemon = static_cast<HttpDaemon*> (arg);
    size_t n = vsnprintf(nullptr, 0, fmt, ap);
    char *buffer = nullptr;
    try
    {
        buffer = new char[n + 1];
        vsprintf(buffer, fmt, ap);
        try
        {
            daemon->m_lastMessage = std::string(buffer);
        }
        catch (...)
        {
            delete[] buffer;
            throw;
        }
    }
    catch (...)
    {
        //buffer allocation failed
        daemon->m_lastMessage = "Memory allocation failure.";
    }
    if(buffer)
        delete[] buffer;
}
void HttpDaemon::parseMessageVa(void*arg、const char*fmt、va_list&ap)
{
HttpDaemon*daemon=static_cast(arg);
大小n=vsnprintf(nullptr,0,fmt,ap);
char*buffer=nullptr;
尝试
{
缓冲区=新字符[n+1];
vsprintf(缓冲区、fmt、ap);
尝试
{
daemon->m_lastMessage=std::string(缓冲区);
}
捕获(…)
{
删除[]缓冲区;
投掷;
}
}
捕获(…)
{
//缓冲区分配失败
守护进程->m_lastMessage=“内存分配失败。”;
}
if(缓冲区)
删除[]缓冲区;
}

va_list&ap
——来自C的回调不会通过引用传递任何内容。函数应按值获取列表。

va_list&ap
——来自C的回调不会通过引用传递任何内容。函数应该按值获取列表。

不,我不知道。你能提供一个[MCVE重现你的问题吗?]为什么你要手动管理内存,然后尝试在所有退出路径上释放它?只需使用
std::vector
std::string
中的一种。特别是因为您无论如何都要将其转换为
std::string
。而且,
va_list
被设计为按值传递,当您引用它时,可能会出错。你能显示调用这个的代码吗?(或者因为它是一个回调函数,所以使用函数指针)
va_list&ap
——来自C的回调函数不会通过引用传递任何内容。该函数应按值获取列表。我不确定否决票的目的是什么。也许如果有人(最好是给他们的人)能告诉我,那么下次我可以问一个更好的问题。不,我不知道。你能提供一个[MCVE重现你的问题吗?]为什么你要手动管理内存,然后尝试在所有退出路径上释放它?只需使用
std::vector
std::string
中的一种。特别是因为您无论如何都要将其转换为
std::string
。而且,
va_list
被设计为按值传递,当您引用它时,可能会出错。你能显示调用这个的代码吗?(或者因为它是一个回调函数,所以使用函数指针)
va_list&ap
——来自C的回调函数不会通过引用传递任何内容。该函数应按值获取列表。我不确定否决票的目的是什么。也许如果有人(最好是给他们的人)能告诉我,那么下次我可以问一个更好的问题。