va_list在C和C++之间是否不兼容

Is va_list incompatible between C and C++?

本文关键字:C++ 之间 是否 不兼容 list va      更新时间:2023-10-16

我使用的是一个库(GNU MicroHttpDaemon),它通过回调传递错误消息,该回调获取一个va_list。我传入一个函数指针,如果发生错误,就会用va_list和其他一些参数调用我的函数。我的问题是,当我收到va_list时,它是垃圾,试图使用它会引发异常。我使用的是Windows 10上的Visual Studio 2015。MicroHttpDaemon是使用相同的编译器构建的。我对原因的最佳猜测是MicroHttpDaemon是用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;
}

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