Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有没有一种方法可以包装具有va_args参数的函数?_C - Fatal编程技术网

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++。