va_list是否与C和C ++不兼容?

时间:2016-08-03 21:44:44

标签: c++ c visual-studio variadic-functions

我正在使用一个库(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;
}

1 个答案:

答案 0 :(得分:4)

double - 来自C的回调不会通过引用传递任何内容。该函数应按值列出。