【问题标题】: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&lt;char&gt;std::string 之一。特别是因为无论如何您都要将其转换为std::string
  • 另外,va_list 被设计为按值传递,当你引用它时可能会出错。你能显示调用它的代码吗? (或者既然是回调,就做函数指针)
  • va_list &amp;ap -- 来自 C 的回调不会通过引用传递任何内容。该函数应按值获取列表。
  • 我不确定投反对票的目的是什么。也许如果有人(最好是那些给他们的人)可以告诉我,那么我下次可以问一个更好的问题。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2015-11-18
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多