C++ 带有时间戳的自定义打印功能,提供警告
我做了一个定制的打印函数,可以打印带有时间戳的消息。但当我编译它时,编译器说“格式字符串不是字符串文字”。它仍然可以很好地编译,但是我有点被这个错误所困扰,因为编译器也说这可能是不安全的,所以我想修复它C++ 带有时间戳的自定义打印功能,提供警告,c++,c,timestamp,printf,C++,C,Timestamp,Printf,我做了一个定制的打印函数,可以打印带有时间戳的消息。但当我编译它时,编译器说“格式字符串不是字符串文字”。它仍然可以很好地编译,但是我有点被这个错误所困扰,因为编译器也说这可能是不安全的,所以我想修复它 void Log(const char *message, ...) { time_t rawtime; struct tm* timeinfo; char timestamp[11]; time(&rawtime); timeinfo = lo
void Log(const char *message, ...)
{
time_t rawtime;
struct tm* timeinfo;
char timestamp[11];
time(&rawtime);
timeinfo = localtime(&rawtime);
strftime(timestamp, 11, "%X: ", timeinfo);
fprintf(stdout, timestamp); // format not a string literal and no format arguments [-Wformat-security]
va_list args;
va_start(args, message);
vfprintf(stdout, message, args);
va_end(args);
fprintf(stdout, "\n");
}
我尝试将时间戳
更改为const char*
,但strftime
不接受,警告仍然存在
我如何解决这个问题,有没有办法优化这个函数(因为我不太了解cio库
)
问题是,如果时间戳字符串包含%s或类似值,那么fprintf函数将查找附加参数(您没有提供)
fprintf
用于由格式字符串引导的格式化输出。调用时不带参数,但格式字符串有点误用,启动速度慢。为了安全使用fprintf
,您应该使用fprintf(stdout,“%s”,时间戳)代码>
或者,只需使用fputs(timestamp,stdout)代码>这绕过了格式字符串的解析,只将字符串按原样打印到标准输出。这正是您想要的,而且速度更快,因为fputs
不解析要打印的字符串 这是一个适当的警告。您需要fprintf(标准输出,“%s”,时间戳);解释如下:或者他可以使用put(timestamp)
并删除对fprintf()
的第二个调用,因为put
追加了一个换行符。
fprintf(stdout, "%s", timestamp);
fprintf(stdout, timestamp);