是自己写的一个C++日志类,使用用Visual Studio2019编译的时候报错了如下:

严重性 代码  说明  项目  文件  行   禁止显示状态
错误  C4996   'localtime': This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. MemoPad E:\code\demo\wx.hook\messages\syslog.cpp  63

里面确实用到了日期时间函数,代码大概是这样:

string currTime() {
    char tmp[64];
    time_t ptime;
    time(&ptime);  
    strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S", localtime(&ptime));
    return tmp;
}

解决办法是在这个文件的上面加上如下一行:

#pragma warning(disable:4996)

再编译就不会报错了。

替代写法与建议

C4996 是 Visual Studio 的安全告警:localtime 返回的静态缓冲区非线程安全,多线程并发调用会互相覆盖时间串。正确的做法是改用线程安全版本。

  • MSVC:localtime_s,注意参数顺序是"输出指针在前,时间戳在后";
  • Linux/POSIX:localtime_r,参数顺序与 MSVC 相反,跨平台项目可用宏统一;
  • 不建议用 _CRT_SECURE_NO_WARNINGS 压警告:问题被隐藏而非解决;
  • 日志类里若多处调用,可封装一个返回 tm 结构体的内联工具函数统一处理。

相关阅读