已知数量的args,在c中转发可变参数函数

坦纳菲尔

我知道通常不可能将可变参数从一个可变参数函数转发到另一个:Forward an invocation of a variadic function in C http://c-faq.com/varargs/handoff.html

我的问题是,如果我知道被调用者中可变参数 args 的数量,是否有可能?例如,是否可以编写 f_wrapper 以将 ... 参数传递给 f?:

int f_wrapper(int argc, ...){ 
  /* argc is the number of variadic args f_wrapper is called with. Can it be used to call f? */
  /* Example: f_wrapper(3, "arg1", "arg2", "arg3"); */
}
int f(...){
  /* f must be called with all ... args from f_wrapper. */
  /* Adding signature with va_list is NOT allowed. c++ is NOT allowed */
}
约翰·布林格

我的问题是,如果我知道被调用者中可变参数 args 的数量,是否有可能?例如,是否可以编写 f_wrapper 以将 ... 参数传递给 f?

基本问题是,将可变参数从一个可变参数函数转发到另一个是词汇问题,而不是数据处理问题。您必须编写对包装函数的调用,其中每个参数都有一个编译时表示,但直到运行时您才知道会有多少个参数,并且您可能不知道它们的类型。

如果可接受的参数列表的空间受到足够的限制,那么这个问题实际上是可以解决的。例如,如果包装器只允许少数类型的可变参数(它知道如何识别),那么它可以在运行时分析可变参数以将它们匹配到适当的一个对包装函数的可能调用列表。像这样的东西:

int f_wrapper(int argc, ...) {
    if (argc < 0 || argc > F_ARGS_MAX) {
        // unsupported number of arguments
        return -1;
    }

    int arg_values[F_ARGS_MAX];
    // ... read argc variadic arguments into arg_values ...

    switch (argc) {
        case 0:
            return f();
        case 1:
            return f(arg_values[0]);
        // ...
    }
}

然而,显然,这很快就会变得不切实际,如果可接受的参数数量没有上限,它根本无法应对。

正如评论中所建议的那样,可变参数宏可能是一个更可行的替代方案,但这并不是一个完全的替代方案。例如,您不能构造指向宏的指针,不能使用这样的宏为具有内部链接的函数提供外部接口,宏不能以与函数相同的方式承载静态变量,...。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在可变函数中转发特定范围的参数

如何在C ++ 11中实现可变参数模式以将可变数量的参数转发给函数?

转发C中可变参数函数的调用

在C ++中转发参数

为什么函数默认参数不能在C ++中转发?

在按值调用中转发构造函数参数(C ++)

我如何将数组作为args列表传递给C中具有可变数量参数的函数

C ++ 11:可变参数模板函数参数的数量?

在C ++中将已知数量的整数输入正确读取到向量中

如何在函数中解压缩可变数量参数 (*args) 的元组?

使用已知数量的元素填充向量:在构造函数中指定其大小还是使用保留方法?

CF是否不支持具有可变数量的参数和任何已知解决方法的Java构造函数?

将相同的参数转发给C ++中的可变参数元组构造函数

函数中可变数量的参数

计算宏函数中可变参数的数量

Julia + JuMP:函数的可变数量的参数

Pascal函数参数的可变数量

TypeScript - 参数数量可变的函数类型

使用purrr :: map_df在函数中转发参数

在 CMake 中转发无值函数参数的简单方法

将可变参数函数参数转发到std :: function对象

完美转发可变参数模板参数到成员函数

C ++可变参数模板参数的数量

c ++ 11:使用向量的元素调用可变参数函数,并自动推导参数数量

C++ 可变数量的可变参数模板参数

将固定的已知数据存储在类中(C ++)

为什么不能在不可变的情况下在lambda中转发参数?

以可变参数作为函数C ++的参数的函数

C程序中可变数量的参数