我想用 c 语言编写一个使用省略号 (...) 参数的函数,但我不知道它是如何工作的。
我想做这样的事情:
void error(const char* fmt, ...);
void error(const char* fmt, ...) {
// fprintf(stderr, fmt, ...); << didnt work!
fprintf(stderr, fmt, /* ??? */);
}
我想像“普通”printf() 调用一样使用它。
error("bla");
error("nr: %d", 42);
error("pi: %f", 3.1415);
我怎样才能访问省略号作为空洞的东西并将它传递给下一个函数?
省略号不以您可以直接处理或转发的任何方式构成“包”。管理与任何函数参数都不匹配的函数参数的唯一方法是通过 <stdarg.h>
特点。
这意味着对于每个变量函数foo
你也应该总是有一个相应的功能vfoo
消耗 va_list
.例如:
#include <stdarg.h>
void foo(const char * fmt, ...);
void vfoo(const char * va_list ap);
前者通常根据后者来实现:
void foo(const char * fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vfoo(fmt, ap);
va_end(ap);
}
幸运的是,printf
函数族遵循这些规则。所以,当你想外包给一个printf
函数,你实际使用的是对应的底层vprintf
版本:
void error(const char * fmt, ...)
{
do_stuff();
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
}
当然,按照同样的规则,你应该写一个 verror
首先运行并进行调用vprintf
:
void verror(const har * fmt, va_list ap)
{
do_stuff();
vfprintf(stderr, fmt, ap);
}