我正在使用一个库(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;
}
答案 0 :(得分:4)
double
- 来自C的回调不会通过引用传递任何内容。该函数应按值列出。