gpt4 book ai didi

c++ - C++ 中的 fprintf 和 vfprintf 有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:04 25 4
gpt4 key购买 nike

<分区>

我无法找到以下问题的答案,而且我有一些与功能相关的问题。

我的主要编程是用C#完成的,在学习的时候并没有真正学过C++,但在我现在的工作中我也必须做一些C++编程。

大部分 C++ 编程都是由一位前雇员完成的,他制作了一个日志记录功能。

偶尔这个函数会导致错误(访问冲突)——这不会向用户显示,但我在通过调试器运行代码时看到了它。

当错误发生时它指向这行代码:

vfprintf( LogFile, fmt, va );

然后我仔细查看了之前和之后的代码,将上面的内容放在上下文中,代码是:

void FileLog( char *fmt, ... )
{
va_list va;
struct time t;
struct date d;
long clk;
static int ReEntrant = 0;

if( FileLogEnabled == false )
return;

ReEntrant++;
if( ReEntrant > 1 )
return;

if( LogFile == NULL )
LogFile = fopen( LogFileName, "a+" );
if( LogFile != NULL )
{
gettime( &t );
getdate( &d );
fprintf( LogFile, "\n%d-%02d-%02d %2d:%02d:%02d.%02d0> ", d.da_year, d.da_mon, d.da_day, t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund );

va_start( va, fmt );
vfprintf( LogFile, fmt, va );
va_end( va );

fflush( LogFile );
...
}
ReEntrant = 0;
}

实际上我不明白为什么需要它(如果需要的话?)同时调用 fprintf 和 vfprintf?我认为第一个 fprintf 调用会将格式化的字符串写入流(文件),这就足够了吗?

一点解释或一些信息将不胜感激:)

编辑: 在 nos 的评论之后 - 我追踪到今天经常导致此错误的函数的特定调用。

FileLog( "TimerRestore[%d], Name=%s", Package.CurGame->Timers[ Index ].Name.c_str() );

我确实认为这可能会引起一些麻烦,因为“TimerRestore[%d],Name=%s”后面应该跟一个十进制和字符串参数,但是只给出了一个字符串参数。我需要做一些测试,但我确定编写这段代码的作者的意思是:

FileLog( "TimerRestore[%d], Name=%s", Index, Package.CurGame->Timers[ Index ].Name.c_str() );

但是我仍然不明白为什么函数调用似乎并不总是导致错误。或者可能是 FileLog 函数中的“ReEntrant”变量在它没有失败时阻塞它的原因?

非常感谢所有的反馈和信息。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com