2012-02-22 93 views
5

有一个功能:有没有办法来包装函数有va_args参数?

void some_function(int id,...); 

问题:有没有办法来包装这个功能吗?这意味着得到的东西是这样的:

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

http://stackoverflow.com/questions/9329440/process-va-args-in-c的[转发在C可变参数函数的调用( – BoBTFish 2012-02-22 11:30:56

+0

可能重复http://stackoverflow.com/questions/150543/forward-an-invocation-of-a-variadic-function-in-c) – sth 2012-02-22 11:58:56

+0

@sth有点区别:我需要包装一个函数,所以我不能修改源函数。我的答案 – 2r2w 2012-02-22 13:42:43

回答

5

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

+0

太棒了。你可以指出一些MS视觉工作室的替代品吗? – 2r2w 2012-02-22 13:37:44

+0

我不知道MS是否有其他选择。 – ugoren 2012-02-22 13:47:53

1

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

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

谢谢。但我需要一个功能 – 2r2w 2012-02-22 13:31:52

0

我假设你包装的功能并不“知道”的在编译时传递的参数(和它们的类型)的实际数量,否则,你可能只是找回它们并调用包装的函数。

然后,这只能通过使用内联汇编器(因此 - 平台相关的解决方案)来解决。这也取决于你想如何包装你的功能,你是否需要为你的包装保留堆栈(即你不需要本地函数变量)等。

0

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

4

因为这也被标记为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)...); 
} 
+0

谢谢。有趣。但不是我需要的。我需要C函数 – 2r2w 2012-02-22 13:32:57

+0

@ 2r4w:对不起,但不要标记它C++。 – Xeo 2012-02-22 13:49:00

+0

我删除了错误的标签。但你的回答很有用 – 2r2w 2012-02-22 13:51:41

相关问题