我知道通常不可能将可变参数从一个可变参数函数转发到另一个: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] 删除。
我来说两句