我正在尝试以下列方式使用vfprintf
vfprintf(fp,buffer,arg);
我使用运行的日期和时间创建的fp日志文件,缓冲区和其余的args
fp = fopen(filename, "a");
va_start(arg, message);
vprintf(message, arg); // print stdout
vfprintf(fp, buffer, arg); // print to file
va_end(arg);
fclose(fp);
它与数字完美配合,并且它因错误而死亡:vfprintf source not found at ....
有没有人知道我做错了什么?
答案 0 :(得分:3)
您可能正在使用64位架构,其中可变长度arg
只能传递一次。要使用arg
va_copy()
,请进行更多传递
va_list arg, arg2;
va_start(arg, message);
va_copy(arg2, arg);
vprintf(message, arg); // print stdout
va_end(arg);
vfprintf(fp, buffer, arg2); // print to file
va_end(arg2);
来自man va_arg
:
va_arg()宏扩展为具有类型和值的表达式 调用中的下一个参数。参数ap是va_list ap 由va_start()初始化。 每次调用va_arg()都会修改ap 下一个调用返回下一个参数。参数类型是一个类型 指定的名称,以便指向具有该对象的对象的指针类型 只需在类型中添加*即可获得指定的类型。
...
如果将ap传递给使用va_arg(ap,type)的函数,则返回值 在返回该函数后,ap未定义。