是自己写的一个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 结构体的内联工具函数统一处理。