【问题标题】:Is there a way to wrap function having va_args arguments?有没有办法包装具有 va_args 参数的函数?
【发布时间】:2012-02-22 11:25:13
【问题描述】:

有一个功能:

void some_function(int id,...);

问题:有没有办法包装这个函数?这意味着得到这样的东西:

void wrapped_some_function(int id,...)
{
   //do smth
   some_function(id,...);
}

【问题讨论】:

标签: c


【解决方案1】:

使用 gcc,__builtin_apply_args__builtin_apply,记录在案的here,可以做到。
对于标准 C,没有办法(其他答案建议可以工作,但这不是您要求的 100%)。
但是如果some_function 的变体得到va_list(比如vprintfprintf 的变体),您可以使用它。

【讨论】:

  • 太棒了。您能否指出一些 MS Visual Studio 的替代方案?
  • 不知道MS有没有替代品。
【解决方案2】:

因为这也被标记为 C++: C++11 ftw.

#include <utility> // forward

template<class... Args>
void wrapped_some_function(int id, Args&&... args)
{
   //do smth
   some_function(id, std::forward<Args>(args)...);
}

【讨论】:

  • @2r4w:对不起,但不要标记它 C++。
【解决方案3】:

如果您的编译器支持variadic macros,也许您可​​以使用它?

#define wrapped_some_function(id, ...)    \
    do {                                  \
        /* Do something here... */        \
        some_function(id, __VA_ARGS__);   \
    } while (0)

【讨论】:

    【解决方案4】:

    我假设您的包装函数在编译时不“知道”传递的参数的实际数量(及其类型),否则您可以检索它们并调用包装函数。

    那么这只能通过使用内联汇编程序来解决(因此 - 依赖于平台的解决方案)。这也取决于你想如何包装你的函数,你是否需要为你的包装器保留堆栈(即你不需要局部函数变量)等等。

    【讨论】:

      【解决方案5】:

      在一般情况下没有办法做到这一点,因为 some_function 的创建者不可能提供类似的函数 vsome_function 不接受 ...,而是一个 va_list。带有变量参数列表的函数必须有它的对应部分,一个带有va_list 的函数。考虑成对的函数 (printf, vprintf), (sprintf, vsprintf), (CString::Format, CString::FormatV)。

      【讨论】:

        猜你喜欢
        • 2011-04-24
        • 1970-01-01
        • 2018-08-19
        • 1970-01-01
        • 2019-08-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-11
        • 2013-03-01
        相关资源
        最近更新 更多