让我们考虑两个函数,void fooA(int argc, ...)
和void fooB(int argc, ...)
我需要将从fooA获取的变量参数传递给fooB。除了将它们传递给fooB之外,我永远不需要在fooA中处理这些变量参数。
我尝试过将fooB更改为void fooB(int argc, void* argv)
并传递参数,如下面的代码所示:
void fooA(int argc, ...) {
// Some processing ...
va_list list;
va_start(list, argc);
void **argv = NULL;
argv = malloc(argc * sizeof(void*));
for (int i = 0; i < argc; i++)
argv[i] = va_arg(list, void*);
fooB(argc, argv);
}
但它不是很干净,我想知道是否有办法在没有处理fooA函数中的变量参数的情况下这样做。
编辑:它不是this question的欺骗,因为在我的情况下我可以修改fooA或fooB定义(即使我不喜欢)。即使它工作得很好,我也不能接受Jonathan Leffler的技术,因为我不能为每个类似fooB的函数设置一个转发器。它们是用静态函数指针数组调用的,我需要在同一个C文件中单独使用我所有的fooB方法。答案 0 :(得分:0)
如果你想在第二个函数中处理参数,那么在第一个函数中调用start和end,然后在第二个函数中检索参数。
#include <stdarg.h>
void TestSub( int n , va_list* list )
{
for( int i = 0 ; i < n ; i++ )
{
double d = va_arg( *list , double ) ;
printf("%lf " , d ) ;
}
}
void Test( int n , ... )
{
va_list list ;
va_start( list, n ) ;
TestSub( n , &list ) ;
va_end( list ) ;
}
你可以像这样调用这个函数
Test( 3 , 3.14 , ( double )2 , 1234.5678 ) ;
请注意,所有双参数实际上必须是double,如果将整数传递给此变量参数函数,它将不会自动转换。
如果您打算将void指针传递给变量args函数,那么请确保它们确实无效*!