有点挑战的问题,怎样手动给va_list增加元素

情况是这样的, 我需要输出日志。

希望接口是DEBUG(const char* format, ...)

于是用到了stdarg.h里的va_list


而最后实际写入的时候还要在format的前面加上一些前缀,而这个前缀可能是形如"%02d:%02d:%s"一类的东西,其值需要在DEBUG所代表的函数内部计算出来,而不是外面传进去。最后vfprintf的实际format参数其实是
函数内部的"%02d:%02d:%s"以及传进来的format拼接而成,所以后面的传递给vfprintf的可变参数的除了用户传进来的va_list对象之外,在前面还应该有一些函数内部计算出来的数字。
而库函数vfprintf的声明却偏偏只有一个va_list,因此必须将函数内部计算出来的数值塞到va_list的前部去,能做到么?

另外,不能先调用一次fprintf把内部的参数输出了再vfprintf,因为在多线程环境下这样两个操作会被交错,从而打乱输入顺序。在采用了O_APPEND或者a+模式进行写的情况下,我也不想再次加锁影响性能,有解决的方法么?

作者: morocco   发布时间: 2011-01-26

往 va_list 里面加东西只有 hack 的方法,没有标准的方法。

你可以先 sprintf 到字符串里再一次写进去。

作者: 变异老鼠   发布时间: 2011-01-28

再封装一层吧

作者: Godbach   发布时间: 2011-01-28