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

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

【讨论】:

以上是关于va_list 在 C 和 C++ 之间是不是不兼容? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

可变參数列表

急!请高手指教c++如何定义一个参数个数不确定的函数?

C++可变参数使用总结

C++可变参数使用总结

如何判断 va_list 是不是为空

C++中,如果我们想要获取不确定个数的参数进入函数,就可以使用va_list类型的变量