有一个功能:有没有办法来包装函数有va_args参数?
void some_function(int id,...);
问题:有没有办法来包装这个功能吗?这意味着得到的东西是这样的:
void wrapped_some_function(int id,...)
{
//do smth
some_function(id,...);
}
有一个功能:有没有办法来包装函数有va_args参数?
void some_function(int id,...);
问题:有没有办法来包装这个功能吗?这意味着得到的东西是这样的:
void wrapped_some_function(int id,...)
{
//do smth
some_function(id,...);
}
如果你的编译器支持variadic macros,也许你可以使用?
#define wrapped_some_function(id, ...) \
do { \
/* Do something here... */ \
some_function(id, __VA_ARGS__); \
} while (0)
谢谢。但我需要一个功能 – 2r2w 2012-02-22 13:31:52
我假设你包装的功能并不“知道”的在编译时传递的参数(和它们的类型)的实际数量,否则,你可能只是找回它们并调用包装的函数。
然后,这只能通过使用内联汇编器(因此 - 平台相关的解决方案)来解决。这也取决于你想如何包装你的功能,你是否需要为你的包装保留堆栈(即你不需要本地函数变量)等。
在一般情况下,没有办法做到这一点,并且因为some_function的创建者不应该提供类似的函数vsome_function
而不是...,而是一个va_list
。具有可变参数列表的函数必须具有其计数器部分,其功能为va_list
。考虑函数对(printf,vprintf),(sprintf,vsprintf),(CString :: Format,CString :: FormatV)。
因为这也被标记为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)...);
}
http://stackoverflow.com/questions/9329440/process-va-args-in-c的[转发在C可变参数函数的调用( – BoBTFish 2012-02-22 11:30:56
可能重复http://stackoverflow.com/questions/150543/forward-an-invocation-of-a-variadic-function-in-c) – sth 2012-02-22 11:58:56
@sth有点区别:我需要包装一个函数,所以我不能修改源函数。我的答案 – 2r2w 2012-02-22 13:42:43