在C中,是否可以转发可变参数函数的调用?如,
int my_printf(char *fmt, ...) {
fprintf(stderr, "Calling printf with fmt %s", fmt);
return SOMEHOW_INVOKE_LIBC_PRINTF;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,以上述方式转发调用显然不是必需的(因为你可以用其他方式记录调用,或者使用vfprintf),但是我正在处理的代码库要求包装器做一些实际的工作,并且没有没有(并且不能添加)类似于vfprintf的辅助函数.
[更新:基于迄今为止提供的答案,似乎存在一些混淆.用另一种方式表达问题:通常,你可以包装一些任意的可变参数函数而不修改该函数的定义.
假设我在Objective-c中有一个类,其静态方法如下:
+ (NSError *)executeUpdateQuery:(NSString *)query, ...;
Run Code Online (Sandbox Code Playgroud)
我如何从Swift中调用它?自动完成功能无法识别它,编译器对以下内容不满意:
MyClassName.executeUpdateQuery("")
Run Code Online (Sandbox Code Playgroud)
抱怨'MyClassName.Type没有名为executeUpdateQuery的成员'
说我有2个功能
void f1(int p1, int v1, ...);
Run Code Online (Sandbox Code Playgroud)
和
void f2(int v1, ...);
Run Code Online (Sandbox Code Playgroud)
在f1里面我想将所有参数从variadic列表传递给f2:
void f1(int p1, int v1, ...) {
f2(/*pass all variadic parameters*/);
}
Run Code Online (Sandbox Code Playgroud)
例如,当我打电话时,f1(1, 2, 3, 4, 5) 我希望将2,3,4,5传递给f2
旧客户代码:
printf("foo: %d, bar: %s.\n", f, b);
Run Code Online (Sandbox Code Playgroud)
我想用以下内容替换printf(&100的其他人喜欢)
my_printf(ctrl1, ctrl2, "foo: %d, bar: %s.\n", f, b);
Run Code Online (Sandbox Code Playgroud)
my_printf的实现
void my_printf(CtrlT1 c1, Ctrl c2, char* fmt, ...) {
/* Do stuff with c1 & c2 */
fprintf(log, fmt, **WHAT_GOES_HERE**);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过的
似乎应该有一种简单,直接的方法将与...through 相关的参数列表传递给fprintf.我试过,fprintf(log, fmt, ...);但编译器抱怨说,"'''令牌之前的语法错误".
我也尝试过:
va_list ap;
va_start(ap, fmt);
fprintf(log, fmt, ap);
使用va_list的调用可以编译甚至运行而不会进行核化,但是传递给printf的内容显然与传入函数的内容不同...,可以通过输出(非打印字符的表示)来判断.
如果推动推进,我可能会通过蛮力走过va_list的内容,但这似乎很愚蠢.是否没有简单的令牌或语法来传递它...?