VFprintf 无法正常工作
vfprintf doesn't work properly
我有一个类:
FILE *logFile = fopen("out.log", "w");
class Log {
public:
static void d(const char *message, ...) __attribute__((format (printf, 1, 2)));
}
在源文件中:
void Log::d(const char *message, ...) {
va_list argptr;
va_start(argptr, message);
vprintf(message, argptr);
printf("n");
fflush(stdout);
if (logFile) {
vfprintf(logFile, message, argptr);
fprintf(logFile, "n");
fflush(logFile);
}
va_end(argptr);
}
但是当我调用例如Log::d("test %d %s %f", 10, "str", 0.1);
它会test 0 @WAíõ 0,000000
打印到文件中时。
怎么了?
问题是您使用va_list
argptr
2 次。一次在vprintf
中,第二次在vfprintf
通话中。va_list
如何与堆栈一起工作是实现定义的,请参阅此处。例如,va_list
类型是在 Linux 中实现的x86_64就像在 SO 上所说的那样:
va_list类型
va_list 类型是一个数组,其中包含一个结构的单个元素,其中包含实现va_arg宏所需的信息。va_list类型的C定义如图3.34所示
// Figure 3.34 typedef struct { unsigned int gp_offset; unsigned int fp_offset; void *overflow_arg_area; void *reg_save_area; } va_list[1];
如果将va_list
传递到第一个vprintf
调用中,并且函数返回,则va_list
将不再像调用之前一样。第二次调用vfprintf
将得到"错误/消耗va_list
"。
溶液:
va_start
后使用va_copy
,或者如果您的编译器不支持va_copy
,则使用va_start
2 次。但请记住,每次调用va_copy
或va_start
都需要相应的调用va_end
。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- sdl软件渲染器不工作,工作在硬件加速的一个
- C++程序已停止工作-求解常微分方程