我制作了一个自定义打印函数,它打印带有时间戳的消息。但是当我编译它时,编译器说“格式字符串不是字符串文字”。它仍然可以正常编译,但我有点被这个错误所困扰,因为编译器还说这可能是不安全的,所以我想修复它。
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");
}
我尝试将 timestamp
更改为 const char*
但 strftime
不接受它并且警告仍然存在。
我该如何解决这个问题,有什么方法可以优化这个函数(因为我对 C IO 库
了解不多)?
最佳答案
fprintf(stdout, timestamp);
fprintf
用于由格式字符串定向的格式化输出。不带参数但格式字符串的调用有点误用,而且启动速度很慢。为了安全地使用 fprintf
,您应该使用 fprintf (stdout, "%s", timestamp);
或者,只需使用 fputs (timestamp, stdout);
这将绕过格式字符串的解析,并按原样将字符串打印到标准输出。这正是您想要的,而且速度更快,因为 fputs
不解析要打印的字符串。
关于c++ - 带有时间戳的自定义打印功能给出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12391528/