我有一个名为foo
的函数,该函数接受...
,我想将在...
中传递的所有参数传递给名为oof
的函数,示例代码:
#include <stdio.h>
#include <stdarg.h>
void oof(FILE * f, const char * fmt, ...){
va_list args;
va_start(args, fmt);
vfprintf(f, fmt, args);
va_end(args);
}
void foo(const char * fmt, ...){
oof(stdout, fmt, ...); // how can I pass the 3 dots?
// do other things in the function block
}
int main(int argc, char *argv[]){
foo("Hello %sn", "World");
}
我不想传递给oof
一个va_list
,但参数本身
您需要更改oof
以接受va_list
并传递它。
void oof(FILE * f, const char * fmt, va_list args){
vfprintf(f, fmt, args);
}
void foo(const char * fmt, ...){
va_list args;
va_start(args, fmt);
oof(stderr, fmt, args);
va_end(args);
}
不能通过函数来实现,但可以通过宏来实现:
#define foo(...) oof(__VA_ARGS__)
还有一个问题。
你从哪里得到FILE *f
参数?假设它是stdout
,那么将宏定义为:
#define foo(...) oof(stdout, __VA_ARGS__)
,如果你想消除一些参数(做上面的逆,只需做以下操作:
#define foo(a, b, ...) oof(__VA_ARGS__)
这与dbush的回答(dbush)相似应该得到信任-不要接受我的答案而不是他们的),但由于OP的声明而略有修改:
我不想传递给
oof
一个va_list
,但参数本身
因为va_list
需要传递给某些东西,我定义了一个不同的函数voof
,由oof
和foo
调用:
#include <stdio.h>
#include <stdarg.h>
void voof(FILE * f, const char * fmt, va_list args){
vfprintf(f, fmt, args);
}
void oof(FILE * f, const char * fmt, ...){
va_list args;
va_start(args, fmt);
voof(f, fmt, args);
va_end(args);
}
void foo(const char * fmt, ...){
va_list args;
va_start(args, fmt);
voof(stderr, fmt, args);
va_end(args);
}
int main(int argc, char *argv[]){
foo("Hello %sn", "World");
}
foo
和oof
目前做同样的事情,除了oof
中额外的FILE *
参数。