C++ - 'localtime' 这个函数或变量可能不安全
C++ - 'localtime' this function or variable may be unsafe
出于学习目的,我正在用 C++ 编写一个简单的日志记录 class。我的代码包含一个函数,该函数 returns 今天日期的字符串。但是,每当调用 'localtime' 时我都会收到编译器错误。
std::string get_date_string(time_t *time) {
struct tm *now = localtime(time);
std::string date = std::to_string(now->tm_mday) + std::to_string(now->tm_mon) + std::to_string(now->tm_year);
return date;
}
我试过使用#define _CRT_SECURE_NO_WARNINGS
。它没有用,出现了同样的错误。我还尝试将 _CRT_SECURE_NO_WARNINGS
放入项目属性的预处理器定义中。这给出了一个未解决的外部错误。
有人知道该怎么做吗?
问题是 std::localtime
不是线程安全的,因为它使用静态缓冲区(在线程之间共享)。 POSIX
和 Windows
都有安全的替代方案:localtime_r and localtime_s.
我是这样做的:
inline std::tm localtime_xp(std::time_t timer)
{
std::tm bt {};
#if defined(__unix__)
localtime_r(&timer, &bt);
#elif defined(_MSC_VER)
localtime_s(&bt, &timer);
#else
static std::mutex mtx;
std::lock_guard<std::mutex> lock(mtx);
bt = *std::localtime(&timer);
#endif
return bt;
}
// default = "YYYY-MM-DD HH:MM:SS"
inline std::string time_stamp(const std::string& fmt = "%F %T")
{
auto bt = localtime_xp(std::time(0));
char buf[64];
return {buf, std::strftime(buf, sizeof(buf), fmt.c_str(), &bt)};
}
尝试在 #include
任何其他头文件之前 #define _CRT_SECURE_NO_WARNINGS
,如以下代码
#define _CRT_SECURE_NO_WARNINGS
#include <ctime>
//your code
出于学习目的,我正在用 C++ 编写一个简单的日志记录 class。我的代码包含一个函数,该函数 returns 今天日期的字符串。但是,每当调用 'localtime' 时我都会收到编译器错误。
std::string get_date_string(time_t *time) {
struct tm *now = localtime(time);
std::string date = std::to_string(now->tm_mday) + std::to_string(now->tm_mon) + std::to_string(now->tm_year);
return date;
}
我试过使用#define _CRT_SECURE_NO_WARNINGS
。它没有用,出现了同样的错误。我还尝试将 _CRT_SECURE_NO_WARNINGS
放入项目属性的预处理器定义中。这给出了一个未解决的外部错误。
有人知道该怎么做吗?
问题是 std::localtime
不是线程安全的,因为它使用静态缓冲区(在线程之间共享)。 POSIX
和 Windows
都有安全的替代方案:localtime_r and localtime_s.
我是这样做的:
inline std::tm localtime_xp(std::time_t timer)
{
std::tm bt {};
#if defined(__unix__)
localtime_r(&timer, &bt);
#elif defined(_MSC_VER)
localtime_s(&bt, &timer);
#else
static std::mutex mtx;
std::lock_guard<std::mutex> lock(mtx);
bt = *std::localtime(&timer);
#endif
return bt;
}
// default = "YYYY-MM-DD HH:MM:SS"
inline std::string time_stamp(const std::string& fmt = "%F %T")
{
auto bt = localtime_xp(std::time(0));
char buf[64];
return {buf, std::strftime(buf, sizeof(buf), fmt.c_str(), &bt)};
}
尝试在 #include
任何其他头文件之前 #define _CRT_SECURE_NO_WARNINGS
,如以下代码
#define _CRT_SECURE_NO_WARNINGS
#include <ctime>
//your code