C 有没有一种方法可以包装具有va_args参数的函数?
有一个功能:C 有没有一种方法可以包装具有va_args参数的函数?,c,C,有一个功能: void some_function(int id,...); 问题:是否有方法包装此函数?它的意思是得到这样的东西: void wrapped_some_function(int id,...) { //do smth some_function(id,...); } 如果你的编译器支持,也许你可以使用它 #define wrapped_some_function(id, ...) \ do {
void some_function(int id,...);
问题:是否有方法包装此函数?它的意思是得到这样的东西:
void wrapped_some_function(int id,...)
{
//do smth
some_function(id,...);
}
如果你的编译器支持,也许你可以使用它
#define wrapped_some_function(id, ...) \
do { \
/* Do something here... */ \
some_function(id, __VA_ARGS__); \
} while (0)
我假设您的包装函数不“知道”在编译时传递的参数(及其类型)的实际数量,否则您可以检索它们并调用包装函数
然后,这只能通过使用内联汇编程序来解决(因此,依赖于平台的解决方案)。这还取决于您希望如何包装函数,是否需要为包装器保留堆栈(即,您不需要本地函数变量)等等。使用gcc,
\uuuuuu内置应用参数
和\uuuuuuu内置应用
,可以这样做。对于标准C,这是不可能的(其他答案所建议的方法可以奏效,但它不是你要求的100%。
但是如果有一个
函数的变体
可以得到va\u列表
(比如vprintf
是printf
的变体),你可以使用它。一般情况下,没有办法这样做,而且因为某些函数的创建者不可能提供类似的函数vsome\u函数
,它不接受…,而是一个va\u列表
。具有可变参数列表的函数必须有其计数器部分,即具有va\u列表的函数。考虑函数对(PrtTf,VPrimTf),(SpRAMTF,VSCAFTF),(cSt::Frase:CsLo::FrimATV).< /P> < P>因为这也是标记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)...);
}
#包含//转发
模板
void wrapped_some_函数(int-id,Args&&…Args)
{
//做smth
一些_函数(id,std::forward(args)…);
}
可能重复@sth一点区别:我需要包装一个函数,这样我就不能修改源函数了。我得到了我的答案很好。您能指出一些MS VisualStudio的替代方案吗?我不知道是否有一个替代的女士@ RR4W:对不起,但不要标记它的C++。