va_list 在 C 和 C++ 之间是不是不兼容? [关闭]
Posted
技术标签:
【中文标题】va_list 在 C 和 C++ 之间是不是不兼容? [关闭]【英文标题】:Is va_list incompatible between C and C++? [closed]va_list 在 C 和 C++ 之间是否不兼容? [关闭] 【发布时间】:2016-08-03 21:44:43 【问题描述】:我正在使用一个库 (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;
【问题讨论】:
不,我不知道。你能提供一个[MCVE重现你的问题吗?] 您为什么要手动管理内存,然后尝试在所有退出路径上释放它?只需使用std::vector<char>
或std::string
之一。特别是因为无论如何您都要将其转换为std::string
。
另外,va_list
被设计为按值传递,当你引用它时可能会出错。你能显示调用它的代码吗? (或者既然是回调,就做函数指针)
va_list &ap
-- 来自 C 的回调不会通过引用传递任何内容。该函数应按值获取列表。
我不确定投反对票的目的是什么。也许如果有人(最好是那些给他们的人)可以告诉我,那么我下次可以问一个更好的问题。
【参考方案1】:
va_list &ap
-- 来自 C 的回调不会通过引用传递任何内容。该函数应按值获取列表。
【讨论】:
以上是关于va_list 在 C 和 C++ 之间是不是不兼容? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章