许多年前我写了一个自定义的打印函数,声明如下:
void my_printf(char *format_string, ... )
{
// too complex to list here
}
我可以这样调用它:
my_printf("Number of apples = %d\n",apple);
这个函数一直运行得非常完美。现在我想创建一个包装函数,它在开头带上一个额外的整数,就像这样:
void my_printf_extra(int extra,char *format_string, ...
)
可以像这样调用:
my_printf_extra(debug_level,"Number of apples = %d\n",apple);
我希望包装函数能够以类似以下方式调用原始函数:
void my_printf_extra(int extra,char *format_string, ... )
{
if (extra == some_test)
{
my_printf(** not quite sure what goes here **);
}
}
我的猜测是:
void my_printf_extra(int extra,char *format_string, ... )
{
va_list vptr;
if (extra == some_test)
{
va_start(vptr,format_string);
my_printf(format_string,vptr);
va_end(vptr);
}
}
但是它没有起作用。在我的最终输出中,我看到 。
Number of apples = -46467968
当真实值为1时,我看到类似于某些垃圾数字的东西。调用my_printf_extra并传入字符串时也会出现类似的垃圾。我怀疑我的va_list处理有问题,但我无法确定具体是哪里出了问题。
编辑: my_printf()非常灵活,可以打印到各种不同的位置。有时它只是将文本附加到富编辑控件窗口中。这完全取决于各种标志以及正在打印的内容的内容。
va_list
传递到另一个函数不会填充参数,就像它们已经被传递一样。在这里一个合理的解决方案可能是将现有的my_printf
简化为初始化一个va_list
并将其传递给my_printf_core
,后者完成其余的工作。然后您的my_printf_extra
可以调用my_printf_core
而不是my_printf
。(my_printf_core
可以等同于标记原件中提到的vfprintf
,因此基本上是相同的解决方案,除非您需要在my_printf_core
中进行自定义。) - Eric Postpischilmy_printf(const char *format_string, ... )
中使用const
。 - chux - Reinstate Monica