绕过函数中的变量参数列表

时间:2014-06-02 18:23:27

标签: c pointers variadic-functions

让我们考虑两个函数,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方法。

1 个答案:

答案 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函数,那么请确保它们确实无效*!